我目前正在尝试在我的应用中实现多态注释,但是我在转换部分表单方面遇到了问题。
我正在按照本教程step-by-step-guide-to-polymorphic-associations-in-rails进行操作,但它并未涉及此部分。
主要是,我有一个可评论的图像,并且底部有一部分允许用户对图像进行评论。
但是,在提交表单时,找不到@commentable
对象params[:id]
且params[:image_id]
都是零。
我在理解我应该如何传递这些信息时遇到问题,因为部分知道这些信息,但控制器没有。
// images / show.html.erb
<div class="container comment-form" >
<%= render 'comments/form', comment: @image.comments.build %>
</div>
// comments / _form.html.erb
<%= bootstrap_form_for(comment) do |f| %>
<%= f.text_area :message, :hide_label => true, :placeholder => 'Add a comment' %>
<%= f.submit 'Reply', :class=> 'btn btn-default pull-right' %>
<% end %>
// comments_controller.rb
def create
@commentable = find_commentable
@comment = @commentable.comments.build(comment_params) <<<<<
respond_to do |format|
if @comment.save
format.html { redirect_to (comment_path @comment), notice: 'Comment was successfully created.' }
format.json { render :show, status: :created, location: @comment }
else
format.html { render :new }
format.json { render json: @comment.errors, status: :unprocessable_entity }
end
end
end
@comment = @commentable.comments.build(comment_params)
undefined method
评论'为nil:NilClass`
我还注意到请求参数中没有id
。
参数:
{"utf8"=>"✓", "authenticity_token"=>"xxxxxx", "comment"=>{"message"=>"nice photo"}, "commit"=>"Reply"}
感谢您的帮助。
答案 0 :(得分:1)
当您将记录传递给表单构建器时,rails使用polymorphic route helpers *来查找action属性的URL。
要路由到嵌套资源,您需要在数组中传递父级和子级(ren):
bootstrap_form_for([@commentable, @comment])
# or
bootstrap_form_for([@comment.commentable, @comment])
这将为新记录提供路径/images/:image_id/comments
,如果已保留,则为/images/:image_id/comments/:id
。
答案 1 :(得分:0)
您正在尝试两次构建评论。在show.html中使用comment: @image.comments.build
,然后在使用@comment = @commentable.comments.build(comment_params) <<<<<
image_id
您链接的教程包含下面的私有方法。如果您的目标是创建属于您的Image对象的评论,则下面的方法会查找包含Image.find(params[:image_id])
的参数,并返回def find_commentable
params.each do |name, value|
if name =~ /(.+)_id$/
return $1.classify.constantize.find(value)
end
end
nil
end
show.html
您可以将<div class="container comment-form" >
<%= render 'comments/form', image_id: @image.id %>
</div>
更改为传递image_id作为隐藏的参数:
has_many