我正在修改我刚刚完成的guide博客。 我现在想要的是显示验证评论是否有错误,就像我在验证文章时展示它们一样。
我已经在模型中建立了相应的限制,并且实际上有效,因为当您想要使用违反限制的值进行注释时,系统不会保存注释,但是用户不知道为什么会发生这种情况。 / p>
附件中的一些文件:
/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 %>
如何在验证时显示此类错误?
非常感谢你。
答案 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