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

时间:2017-03-24 18:07:17

标签: ruby-on-rails ruby validation

我正在修改我刚刚完成的guide博客。 我现在想要的是显示验证评论是否有错误,就像我在验证文章时展示它们一样。

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

  • Articulo 表示文章
  • Comentar 表示发表评论
  • Comentario 表示评论
  • Comentarios 表示评论

附件中的一些文件:

/app/controllers/articulos_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

/app/controllers/comentarios_controller.rb

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

/app/models/articulo.rb

class Articulo < ApplicationRecord
    has_many :comentarios
    validates :titular, presence: true, length: { minimum: 5 }
    validates :contenido, presence: true, length: { minimum: 10 }
end

/app/models/comentario.rb

class Comentario < ApplicationRecord
    belongs_to :articulo
    validates :comentarista, presence: true, length: { minimum: 4 }
    validates :contenido, presence: true, length: { minimum: 2 }
end

/app/views/articulos/_form.html.erb

<%= 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 %>

/app/views/comentarios/_form.html.erb

<%= 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 %>

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

非常感谢你。

1 个答案:

答案 0 :(得分:0)

你应该创建一个错误消息部分 app / views / shared / _error_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>
  

在文章和评论表单中部分呈现错误消息: /views/comentarios/_form.html.erb 和 的 /views/articulos/_form.html.erb

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

这是 DRY 方式,它可以处理文章和评论或任何对象。

此外,将评论控制器的create操作更改为此操作,因为它会重定向到文章显示页面,而不是显示错误:

def create
  @articulo = Articulo.find(params[:articulo_id])
  @comentario = @articulo.comentarios.create(comentario_params)
  if @comentario.save
    redirect_to articulo_path(@articulo)
  end
end