4

我正在處理我的第一個多態關聯關係,並且無法重構我的form_for創建註釋。重構Form_for在多態關聯中創建註釋的方法

我試過通過Polymorphic Association RailsCasts http://railscasts.com/episodes/154-polymorphic-association?view=asciicast,但它似乎過時了。

我有兩個問題:

  1. 如何重寫我的comment_form部分,以便它會爲任何事commentable工作?我現在的方式,它只能用於(:commentable_id => @traveldeal.id)以來的traveldeals。

  2. 當我創建評論時,commentable_type爲空。什麼是commentable_type,我需要將它傳遞給表單嗎?

謝謝!

user.rb

class User < ActiveRecord::Base 
    has_many :comments, :dependent => :destroy 
end 

traveldeal.rb

class Traveldeal < ActiveRecord::Base 
    has_many :comments, :as => :commentable, :dependent => :destroy 
end 

comment.rb

class Comment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :commentable, :polymorphic => true 

    validates :user_id, :presence => true 
    validates :commentable_id, :presence => true 
    validates :content, :presence => true 
end 

traveldeal_show.html.erb

<%= render 'shared/comment_form' %> 

_comment_form.html.erb

<%= form_for current_user.comments.build(:commentable_id => @traveldeal.id) do |f| %> 
    <%= render 'shared/error_messages', :object => f.object %> 

<div> 
    <%= f.text_area :content %> 
</div> 

<%= f.hidden_field :user_id %> 
<%= f.hidden_field :commentable_id %> 

<div> 
    <%= f.submit "Add Comment" %> 
</div> 
<% end %> 

comments_controller.rb

class CommentsController < ApplicationController 
    before_filter :authenticate, :only => [:create, :destroy] 

    def create 
    @comment = Comment.new(params[:comment]) 
    @comment.save 
    redirect_to root_path 
    end 

end 

回答

2

即在Railscast日的唯一部分是所述路由。

要回答你的第一個問題:創建形式就像是在做Railscast:

<%= form_for [@commentable, Comment.new] do |f| %> 
    <p> 
    <%= f.label :content %><br /> 
    <%= f.text_area :content %> 
    </p> 
    <p><%= f.submit "Submit" %></p> 
<% end %> 

如果你不喜歡這樣commentable_type將自動設置。你需要這種類型,以便知道評論屬於哪個模型。請注意,您必須在使用評論表單的方法中設置@commentable

E.g.

class TraveldealsController < ApplicationController 
    def show 
    @traveldeal = @commentable = Traveldeal.find(params[:id]) 
    end 
end 
+0

謝謝你幫我這個,米莎。當您的答案顯示時,我沒有爲展示頁面設置@commentable。 – Huy 2012-04-12 02:41:24

+0

什麼是params [@commentable,Comment.new]在做什麼?我不太確定'Comment.new'在這種情況下意味着什麼。它是否只是創建一個類似於您在控制器中看到的新記錄? – Huy 2012-04-12 03:15:58

+2

因爲你有一個嵌套的路線,你需要兩個物體作爲你的'form_for'。第一個是評論所屬的對象('@ commentable'),第二個是新的評論對象('Comment.new')。所以是的,這就像在控制器中創建新記錄一樣。你可以在控制器中執行'@comment = Comment.new',但是隻要你有評論表單,你就必須這樣做。只要在視圖中執行'Comment.new'就可以乾淨。 – Mischa 2012-04-12 03:22:01