我在帖子模型中嵌入了一个评论模型:
class Post
include Mongoid::Document
field :name, :type => String
field :content, :type => String
embeds_many :comments
end
class Comment
include Mongoid::Document
field :content, :type => String
validates_presence_of :content
embedded_in :post, :inverse_of => :comments
end
评论表格如预期一样,包含在帖子/节目中:
p#notice = notice
h2= @post.name
p= @post.content
a.btn href=edit_post_path(@post) Edit
h3 New comment
= simple_form_for [@post, Comment.new] do |f|
= f.error_notification
= f.input :content, :as => :text
= f.button :submit
在我的评论控制器中:
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.build(params[:comment])
respond_to do |format|
if @comment.save
format.html { redirect_to @post, notice: 'Comment created.' }
else
format.html { render :template => "posts/show" }
end
end
end
这似乎适用于有效的评论,但对于空白评论有两个问题。首先,不显示验证消息。其次,空白注释在post / show模板中呈现,因为它在调用@comment = @post.comments.build(params[:comment])
后包含在@post中(即使它没有保留)。
关于此主题的railscast使用@post.comments.create!(params[:comment])
而不是build,但这会导致我认为不合适的任何验证失败的例外。
我可以通过重新填写帖子来解决第二个问题,但这似乎很糟糕:
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.build(params[:comment])
respond_to do |format|
if @comment.save
format.html { redirect_to @post, notice: 'Comment created.' }
else
@post = Post.find(params[:post_id])
format.html { render :template => "posts/show" }
end
end
end
即使如此,验证也缺失了。
有没有人建议如何更好地完成这项工作?