我在帖子模型中嵌入了一个评论模型:
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])
.
关于这个主题的 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
即便如此,验证仍然缺失。
有人对如何做得更好有建议吗?