2017-02-02 51 views
0

我目前正試圖在我的應用程序中實現多態註釋,但我遇到了轉換部分表單的問題。Ruby on Rails - 通過部分創建多態註釋

我按照本教程的step-by-step-guide-to-polymorphic-associations-in-rails,但沒有涉及本節。

主要是,我有一個可評論的圖片,以及底部的一個部分,以允許用戶評論圖片。

但是,在提交表單時,無法找到@commentable對象,因爲params[:id]params[:image_id]都爲零。

我有問題了解我應該如何傳遞這些信息,因爲部分知道這些信息,但控制器不知道。

//圖像/ show.html.erb

<div class="container comment-form" > 
    <%= render 'comments/form', comment: @image.comments.build %> 
</div> 

//註釋/ _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評論'for零:NilClass`

我也注意到在請求參數中沒有id

參數:

{"utf8"=>"✓", "authenticity_token"=>"xxxxxx", "comment"=>{"message"=>"nice photo"}, "commit"=>"Reply"}

感謝您的幫助。

回答

1

當你傳遞一個記錄到一個表單生成Rails使用polymorphic route helpers *查找的action屬性的URL。

路由到您需要通過家長和子女在數組中的嵌套的資源:

bootstrap_form_for([@commentable, @comment]) 
# or 
bootstrap_form_for([@comment.commentable, @comment]) 

如果已經堅持這將使路徑/images/:image_id/comments一個新的記錄,並/images/:image_id/comments/:id

+0

*請注意,這與多態關聯沒有任何關係。在這種情況下,'polymorphic'意味着它們很聰明,並且可以計算出你拋棄它的任何對象的路徑。 – max

+0

我能夠得到這個工作,但在我的'form_for'中使用'commentable'而不是'@ commentable'。還需要確保資源嵌套,以便路線存在。 –

0

您正在嘗試構建您的評論兩次。一旦進入show.html,請使用comment: @image.comments.build,然後再次在您的創建方法中使用@comment = @commentable.comments.build(comment_params) <<<<<

您鏈接到的教程包含下面的私有方法。如果你的目標是創建一個屬於你的圖像對象評論,下面的方法將尋找與您image_id設置了一個param,並且將返回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在image_id作爲傳遞隱藏PARAM有:

<div class="container comment-form" > 
    <%= render 'comments/form', image_id: @image.id %> 
</div> 
+0

你好。當我用'image_id'替換它時,由於'comment'爲零,我遇到了'form_for'失敗的問題。我嘗試了'comment'和'@ comment',但都是零。 –