投稿モデルに埋め込まれたコメント モデルがあります。
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
それでも、検証が欠落しています。
これをより良く行う方法について誰か提案がありますか?