Ruby on rails 如何显示集合中每个元素的验证错误?

Ruby on rails 如何显示集合中每个元素的验证错误?,ruby-on-rails,ruby,validation,Ruby On Rails,Ruby,Validation,我正在修改我刚刚完成的博客。 我现在想显示的是,在验证评论时是否有错误,方法与我在验证文章时显示的方法相同 我已经在模型中建立了相应的限制,并且实际上是有效的,因为当您想要使用违反限制的值进行注释时,系统不会保存注释,但用户不知道为什么会发生这种情况 Articulo意思是一篇文章 Comentar表示评论 Comentario表示评论 Comentarios表示评论 附件一些文件: /app/controllers/articulos\u controller.rb class Artic

我正在修改我刚刚完成的博客。 我现在想显示的是,在验证评论时是否有错误,方法与我在验证文章时显示的方法相同

我已经在模型中建立了相应的限制,并且实际上是有效的,因为当您想要使用违反限制的值进行注释时,系统不会保存注释,但用户不知道为什么会发生这种情况

  • Articulo意思是一篇文章
  • Comentar表示评论
  • Comentario表示评论
  • Comentarios表示评论
附件一些文件:

/app/controllers/articulos\u controller.rb

class ArticulosController < ApplicationController

    http_basic_authenticate_with name: "dhh", password: "secreto", except: [:index, :show]

    def index
        @articulos = Articulo.all
    end

    def show
        @articulo = Articulo.find(params[:id])
    end

    def new
        @articulo = Articulo.new
    end

    def edit
        @articulo = Articulo.find(params[:id])
    end

    def create

        @articulo = Articulo.new(articulo_params)

        if @articulo.save
            redirect_to @articulo
        else
            render 'new'
        end

    end

    def update

        @articulo = Articulo.find(params[:id])

        if @articulo.update(articulo_params)
            redirect_to @articulo
        else
            render 'edit'
        end

    end

    def destroy

        @articulo = Articulo.find(params[:id])
        @articulo.destroy

        redirect_to articulos_path

    end

    private

    def articulo_params
        params.require(:articulo).permit(:titular, :contenido)
    end

end
class ComentariosController < ApplicationController

    http_basic_authenticate_with name: "dhh", password: "secreto", only: :destroy

    def new
        articulo = Articulo.find(params[:id])
        @comentario = articulo.comentarios.build
    end

    def create

        @articulo = Articulo.find(params[:articulo_id])

        @comentario = @articulo.comentarios.create(comentario_params)

        redirect_to articulo_path(@articulo)

    end

    def destroy

        @articulo = Articulo.find(params[:articulo_id])

        @comentario = @articulo.comentarios.find(params[:id])
        @comentario.destroy

        redirect_to articulo_path(@articulo)

    end

    private

    def comentario_params
        params.require(:comentario).permit(:comentarista, :contenido)
    end

end
class Articulo < ApplicationRecord
    has_many :comentarios
    validates :titular, presence: true, length: { minimum: 5 }
    validates :contenido, presence: true, length: { minimum: 10 }
end
class Comentario < ApplicationRecord
    belongs_to :articulo
    validates :comentarista, presence: true, length: { minimum: 4 }
    validates :contenido, presence: true, length: { minimum: 2 }
end
<%= form_for @articulo do |f| %>

  <% if @articulo.errors.any? %>
    <div id="error_explanation">
      <h2>
        <%= pluralize(@articulo.errors.count, "error") %> han impedido que el artículo sea grabado:
      </h2>
      <ul>
        <% @articulo.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <p>
    <%= f.label :titular %><br>
    <%= f.text_field :titular %>
  </p>

  <p>
    <%= f.label :contenido %><br>
    <%= f.text_area :contenido %>
  </p>

  <p>
    <%= f.submit 'Guardar' %>
  </p>

<% end %>
<%= form_for([@articulo, @articulo.comentarios.build]) do |f| %>

  <p>
    Nombre<br>
    <%= f.text_field :comentarista %>
  </p>

  <p>
    Comentario<br>
    <%= f.text_area :contenido %>
  </p>

  <p>
    <%= f.submit 'Comentar' %>
  </p>

<% end %>
<%= render 'shared/error_messages', object: f.object %> 
class ArticulosController
/app/controllers/comentarios\u controller.rb

class ArticulosController < ApplicationController

    http_basic_authenticate_with name: "dhh", password: "secreto", except: [:index, :show]

    def index
        @articulos = Articulo.all
    end

    def show
        @articulo = Articulo.find(params[:id])
    end

    def new
        @articulo = Articulo.new
    end

    def edit
        @articulo = Articulo.find(params[:id])
    end

    def create

        @articulo = Articulo.new(articulo_params)

        if @articulo.save
            redirect_to @articulo
        else
            render 'new'
        end

    end

    def update

        @articulo = Articulo.find(params[:id])

        if @articulo.update(articulo_params)
            redirect_to @articulo
        else
            render 'edit'
        end

    end

    def destroy

        @articulo = Articulo.find(params[:id])
        @articulo.destroy

        redirect_to articulos_path

    end

    private

    def articulo_params
        params.require(:articulo).permit(:titular, :contenido)
    end

end
class ComentariosController < ApplicationController

    http_basic_authenticate_with name: "dhh", password: "secreto", only: :destroy

    def new
        articulo = Articulo.find(params[:id])
        @comentario = articulo.comentarios.build
    end

    def create

        @articulo = Articulo.find(params[:articulo_id])

        @comentario = @articulo.comentarios.create(comentario_params)

        redirect_to articulo_path(@articulo)

    end

    def destroy

        @articulo = Articulo.find(params[:articulo_id])

        @comentario = @articulo.comentarios.find(params[:id])
        @comentario.destroy

        redirect_to articulo_path(@articulo)

    end

    private

    def comentario_params
        params.require(:comentario).permit(:comentarista, :contenido)
    end

end
class Articulo < ApplicationRecord
    has_many :comentarios
    validates :titular, presence: true, length: { minimum: 5 }
    validates :contenido, presence: true, length: { minimum: 10 }
end
class Comentario < ApplicationRecord
    belongs_to :articulo
    validates :comentarista, presence: true, length: { minimum: 4 }
    validates :contenido, presence: true, length: { minimum: 2 }
end
<%= form_for @articulo do |f| %>

  <% if @articulo.errors.any? %>
    <div id="error_explanation">
      <h2>
        <%= pluralize(@articulo.errors.count, "error") %> han impedido que el artículo sea grabado:
      </h2>
      <ul>
        <% @articulo.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <p>
    <%= f.label :titular %><br>
    <%= f.text_field :titular %>
  </p>

  <p>
    <%= f.label :contenido %><br>
    <%= f.text_area :contenido %>
  </p>

  <p>
    <%= f.submit 'Guardar' %>
  </p>

<% end %>
<%= form_for([@articulo, @articulo.comentarios.build]) do |f| %>

  <p>
    Nombre<br>
    <%= f.text_field :comentarista %>
  </p>

  <p>
    Comentario<br>
    <%= f.text_area :contenido %>
  </p>

  <p>
    <%= f.submit 'Comentar' %>
  </p>

<% end %>
<%= render 'shared/error_messages', object: f.object %> 
类ComentariosController
/app/models/articulo.rb

class ArticulosController < ApplicationController

    http_basic_authenticate_with name: "dhh", password: "secreto", except: [:index, :show]

    def index
        @articulos = Articulo.all
    end

    def show
        @articulo = Articulo.find(params[:id])
    end

    def new
        @articulo = Articulo.new
    end

    def edit
        @articulo = Articulo.find(params[:id])
    end

    def create

        @articulo = Articulo.new(articulo_params)

        if @articulo.save
            redirect_to @articulo
        else
            render 'new'
        end

    end

    def update

        @articulo = Articulo.find(params[:id])

        if @articulo.update(articulo_params)
            redirect_to @articulo
        else
            render 'edit'
        end

    end

    def destroy

        @articulo = Articulo.find(params[:id])
        @articulo.destroy

        redirect_to articulos_path

    end

    private

    def articulo_params
        params.require(:articulo).permit(:titular, :contenido)
    end

end
class ComentariosController < ApplicationController

    http_basic_authenticate_with name: "dhh", password: "secreto", only: :destroy

    def new
        articulo = Articulo.find(params[:id])
        @comentario = articulo.comentarios.build
    end

    def create

        @articulo = Articulo.find(params[:articulo_id])

        @comentario = @articulo.comentarios.create(comentario_params)

        redirect_to articulo_path(@articulo)

    end

    def destroy

        @articulo = Articulo.find(params[:articulo_id])

        @comentario = @articulo.comentarios.find(params[:id])
        @comentario.destroy

        redirect_to articulo_path(@articulo)

    end

    private

    def comentario_params
        params.require(:comentario).permit(:comentarista, :contenido)
    end

end
class Articulo < ApplicationRecord
    has_many :comentarios
    validates :titular, presence: true, length: { minimum: 5 }
    validates :contenido, presence: true, length: { minimum: 10 }
end
class Comentario < ApplicationRecord
    belongs_to :articulo
    validates :comentarista, presence: true, length: { minimum: 4 }
    validates :contenido, presence: true, length: { minimum: 2 }
end
<%= form_for @articulo do |f| %>

  <% if @articulo.errors.any? %>
    <div id="error_explanation">
      <h2>
        <%= pluralize(@articulo.errors.count, "error") %> han impedido que el artículo sea grabado:
      </h2>
      <ul>
        <% @articulo.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <p>
    <%= f.label :titular %><br>
    <%= f.text_field :titular %>
  </p>

  <p>
    <%= f.label :contenido %><br>
    <%= f.text_area :contenido %>
  </p>

  <p>
    <%= f.submit 'Guardar' %>
  </p>

<% end %>
<%= form_for([@articulo, @articulo.comentarios.build]) do |f| %>

  <p>
    Nombre<br>
    <%= f.text_field :comentarista %>
  </p>

  <p>
    Comentario<br>
    <%= f.text_area :contenido %>
  </p>

  <p>
    <%= f.submit 'Comentar' %>
  </p>

<% end %>
<%= render 'shared/error_messages', object: f.object %> 
class Articulo
/app/models/comentario.rb

class ArticulosController < ApplicationController

    http_basic_authenticate_with name: "dhh", password: "secreto", except: [:index, :show]

    def index
        @articulos = Articulo.all
    end

    def show
        @articulo = Articulo.find(params[:id])
    end

    def new
        @articulo = Articulo.new
    end

    def edit
        @articulo = Articulo.find(params[:id])
    end

    def create

        @articulo = Articulo.new(articulo_params)

        if @articulo.save
            redirect_to @articulo
        else
            render 'new'
        end

    end

    def update

        @articulo = Articulo.find(params[:id])

        if @articulo.update(articulo_params)
            redirect_to @articulo
        else
            render 'edit'
        end

    end

    def destroy

        @articulo = Articulo.find(params[:id])
        @articulo.destroy

        redirect_to articulos_path

    end

    private

    def articulo_params
        params.require(:articulo).permit(:titular, :contenido)
    end

end
class ComentariosController < ApplicationController

    http_basic_authenticate_with name: "dhh", password: "secreto", only: :destroy

    def new
        articulo = Articulo.find(params[:id])
        @comentario = articulo.comentarios.build
    end

    def create

        @articulo = Articulo.find(params[:articulo_id])

        @comentario = @articulo.comentarios.create(comentario_params)

        redirect_to articulo_path(@articulo)

    end

    def destroy

        @articulo = Articulo.find(params[:articulo_id])

        @comentario = @articulo.comentarios.find(params[:id])
        @comentario.destroy

        redirect_to articulo_path(@articulo)

    end

    private

    def comentario_params
        params.require(:comentario).permit(:comentarista, :contenido)
    end

end
class Articulo < ApplicationRecord
    has_many :comentarios
    validates :titular, presence: true, length: { minimum: 5 }
    validates :contenido, presence: true, length: { minimum: 10 }
end
class Comentario < ApplicationRecord
    belongs_to :articulo
    validates :comentarista, presence: true, length: { minimum: 4 }
    validates :contenido, presence: true, length: { minimum: 2 }
end
<%= form_for @articulo do |f| %>

  <% if @articulo.errors.any? %>
    <div id="error_explanation">
      <h2>
        <%= pluralize(@articulo.errors.count, "error") %> han impedido que el artículo sea grabado:
      </h2>
      <ul>
        <% @articulo.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <p>
    <%= f.label :titular %><br>
    <%= f.text_field :titular %>
  </p>

  <p>
    <%= f.label :contenido %><br>
    <%= f.text_area :contenido %>
  </p>

  <p>
    <%= f.submit 'Guardar' %>
  </p>

<% end %>
<%= form_for([@articulo, @articulo.comentarios.build]) do |f| %>

  <p>
    Nombre<br>
    <%= f.text_field :comentarista %>
  </p>

  <p>
    Comentario<br>
    <%= f.text_area :contenido %>
  </p>

  <p>
    <%= f.submit 'Comentar' %>
  </p>

<% end %>
<%= render 'shared/error_messages', object: f.object %> 
class Comentario
/app/views/articulos/_-form.html.erb

class ArticulosController < ApplicationController

    http_basic_authenticate_with name: "dhh", password: "secreto", except: [:index, :show]

    def index
        @articulos = Articulo.all
    end

    def show
        @articulo = Articulo.find(params[:id])
    end

    def new
        @articulo = Articulo.new
    end

    def edit
        @articulo = Articulo.find(params[:id])
    end

    def create

        @articulo = Articulo.new(articulo_params)

        if @articulo.save
            redirect_to @articulo
        else
            render 'new'
        end

    end

    def update

        @articulo = Articulo.find(params[:id])

        if @articulo.update(articulo_params)
            redirect_to @articulo
        else
            render 'edit'
        end

    end

    def destroy

        @articulo = Articulo.find(params[:id])
        @articulo.destroy

        redirect_to articulos_path

    end

    private

    def articulo_params
        params.require(:articulo).permit(:titular, :contenido)
    end

end
class ComentariosController < ApplicationController

    http_basic_authenticate_with name: "dhh", password: "secreto", only: :destroy

    def new
        articulo = Articulo.find(params[:id])
        @comentario = articulo.comentarios.build
    end

    def create

        @articulo = Articulo.find(params[:articulo_id])

        @comentario = @articulo.comentarios.create(comentario_params)

        redirect_to articulo_path(@articulo)

    end

    def destroy

        @articulo = Articulo.find(params[:articulo_id])

        @comentario = @articulo.comentarios.find(params[:id])
        @comentario.destroy

        redirect_to articulo_path(@articulo)

    end

    private

    def comentario_params
        params.require(:comentario).permit(:comentarista, :contenido)
    end

end
class Articulo < ApplicationRecord
    has_many :comentarios
    validates :titular, presence: true, length: { minimum: 5 }
    validates :contenido, presence: true, length: { minimum: 10 }
end
class Comentario < ApplicationRecord
    belongs_to :articulo
    validates :comentarista, presence: true, length: { minimum: 4 }
    validates :contenido, presence: true, length: { minimum: 2 }
end
<%= form_for @articulo do |f| %>

  <% if @articulo.errors.any? %>
    <div id="error_explanation">
      <h2>
        <%= pluralize(@articulo.errors.count, "error") %> han impedido que el artículo sea grabado:
      </h2>
      <ul>
        <% @articulo.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <p>
    <%= f.label :titular %><br>
    <%= f.text_field :titular %>
  </p>

  <p>
    <%= f.label :contenido %><br>
    <%= f.text_area :contenido %>
  </p>

  <p>
    <%= f.submit 'Guardar' %>
  </p>

<% end %>
<%= form_for([@articulo, @articulo.comentarios.build]) do |f| %>

  <p>
    Nombre<br>
    <%= f.text_field :comentarista %>
  </p>

  <p>
    Comentario<br>
    <%= f.text_area :contenido %>
  </p>

  <p>
    <%= f.submit 'Comentar' %>
  </p>

<% end %>
<%= render 'shared/error_messages', object: f.object %> 

海洋地堑:


/app/views/comentarios/\u form.html.erb

class ArticulosController < ApplicationController

    http_basic_authenticate_with name: "dhh", password: "secreto", except: [:index, :show]

    def index
        @articulos = Articulo.all
    end

    def show
        @articulo = Articulo.find(params[:id])
    end

    def new
        @articulo = Articulo.new
    end

    def edit
        @articulo = Articulo.find(params[:id])
    end

    def create

        @articulo = Articulo.new(articulo_params)

        if @articulo.save
            redirect_to @articulo
        else
            render 'new'
        end

    end

    def update

        @articulo = Articulo.find(params[:id])

        if @articulo.update(articulo_params)
            redirect_to @articulo
        else
            render 'edit'
        end

    end

    def destroy

        @articulo = Articulo.find(params[:id])
        @articulo.destroy

        redirect_to articulos_path

    end

    private

    def articulo_params
        params.require(:articulo).permit(:titular, :contenido)
    end

end
class ComentariosController < ApplicationController

    http_basic_authenticate_with name: "dhh", password: "secreto", only: :destroy

    def new
        articulo = Articulo.find(params[:id])
        @comentario = articulo.comentarios.build
    end

    def create

        @articulo = Articulo.find(params[:articulo_id])

        @comentario = @articulo.comentarios.create(comentario_params)

        redirect_to articulo_path(@articulo)

    end

    def destroy

        @articulo = Articulo.find(params[:articulo_id])

        @comentario = @articulo.comentarios.find(params[:id])
        @comentario.destroy

        redirect_to articulo_path(@articulo)

    end

    private

    def comentario_params
        params.require(:comentario).permit(:comentarista, :contenido)
    end

end
class Articulo < ApplicationRecord
    has_many :comentarios
    validates :titular, presence: true, length: { minimum: 5 }
    validates :contenido, presence: true, length: { minimum: 10 }
end
class Comentario < ApplicationRecord
    belongs_to :articulo
    validates :comentarista, presence: true, length: { minimum: 4 }
    validates :contenido, presence: true, length: { minimum: 2 }
end
<%= form_for @articulo do |f| %>

  <% if @articulo.errors.any? %>
    <div id="error_explanation">
      <h2>
        <%= pluralize(@articulo.errors.count, "error") %> han impedido que el artículo sea grabado:
      </h2>
      <ul>
        <% @articulo.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <p>
    <%= f.label :titular %><br>
    <%= f.text_field :titular %>
  </p>

  <p>
    <%= f.label :contenido %><br>
    <%= f.text_area :contenido %>
  </p>

  <p>
    <%= f.submit 'Guardar' %>
  </p>

<% end %>
<%= form_for([@articulo, @articulo.comentarios.build]) do |f| %>

  <p>
    Nombre<br>
    <%= f.text_field :comentarista %>
  </p>

  <p>
    Comentario<br>
    <%= f.text_area :contenido %>
  </p>

  <p>
    <%= f.submit 'Comentar' %>
  </p>

<% end %>
<%= render 'shared/error_messages', object: f.object %> 


名称

科门塔里奥

验证时如何显示此类错误?


非常感谢您。

您应该创建一个错误消息部分app/views/shared/\u error\u messages.html.erb如下:

<% if object.errors.any? %>
  <div id="error_explanation">
  <h2>
    <%= pluralize(object.errors.count, "error") %> han impedido que el 
      artículo sea grabado: # change artículo to the appropriate word 
  </h2>
  <ul>
    <% object.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
  </ul>
</div>

您已经在
/app/views/articulos/_form.html.erb
模板中找到了答案,请查看那里并检查错误是如何显示的。不确定您的问题,如果验证失败,是否要发送自定义消息???@fanta但在/app/views/articulos/_form.html.erb中我有
,然后在/app/views/comentarios/_form.html.erb中,我有了
。它们不一样,我试图调整它,但它不起作用。@AlejandroMontilla验证一篇文章时,如果它不符合任何限制,将显示错误消息。我想做的是做同样的事情,但是对一些文章的每一个评论。看看这篇文章:不,它不起作用。评论的错误消息不显示。我已经自己解决了。无论如何,谢谢你的贡献。