1

投稿モデルに埋め込まれたコメント モデルがあります。

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

これは有効なコメントに対しては機能するようですが、空白のコメントに対しては 2 つの問題があります。まず、検証メッセージは表示されません。第 2 に、空白のコメントは、 を呼び出した後に @post に含まれるため (保持されませんが)、post/show テンプレートでレンダリングされます@comment = @post.comments.build(params[:comment])

このトピックの Railscast@post.comments.create!(params[:comment])は build の代わりに使用しますが、これは適切ではないと思われる検証エラーの例外につながります。

投稿を再取得することで2番目の問題を回避できましたが、これは厄介なようです:

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

それでも、検証が欠落しています。

これをより良く行う方法について誰か提案がありますか?

4

0 に答える 0