Ruby on Rails - 通过partial创建多态注释

时间:2017-02-02 16:15:30

标签: ruby-on-rails ruby ruby-on-rails-3 polymorphism

我目前正在尝试在我的应用中实现多态注释,但是我在转换部分表单方面遇到了问题。

我正在按照本教程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"}

感谢您的帮助。

2 个答案:

答案 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) <<<<<

的create方法中再次使用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