我正在處理我的第一個多態關聯關係,並且無法重構我的form_for創建註釋。重構Form_for在多態關聯中創建註釋的方法
我試過通過Polymorphic Association RailsCasts http://railscasts.com/episodes/154-polymorphic-association?view=asciicast,但它似乎過時了。
我有兩個問題:
如何重寫我的comment_form部分,以便它會爲任何事commentable工作?我現在的方式,它只能用於
(:commentable_id => @traveldeal.id)
以來的traveldeals。當我創建評論時,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
謝謝你幫我這個,米莎。當您的答案顯示時,我沒有爲展示頁面設置@commentable。 – Huy 2012-04-12 02:41:24
什麼是params [@commentable,Comment.new]在做什麼?我不太確定'Comment.new'在這種情況下意味着什麼。它是否只是創建一個類似於您在控制器中看到的新記錄? – Huy 2012-04-12 03:15:58
因爲你有一個嵌套的路線,你需要兩個物體作爲你的'form_for'。第一個是評論所屬的對象('@ commentable'),第二個是新的評論對象('Comment.new')。所以是的,這就像在控制器中創建新記錄一樣。你可以在控制器中執行'@comment = Comment.new',但是隻要你有評論表單,你就必須這樣做。只要在視圖中執行'Comment.new'就可以乾淨。 – Mischa 2012-04-12 03:22:01