如何连接mongoid嵌入式资源的验证

时间:2012-05-04 17:02:16

标签: ruby-on-rails mongoid

我在帖子模型中嵌入了一个评论模型:

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

即使如此,验证也缺失了。

有没有人建议如何更好地完成这项工作?

0 个答案:

没有答案