Ruby on rails newbie在这里,我以前一直在使用CakePHP并希望允许我的创建注释控制器为两个模型创建事件,请帮忙吗?
我的评论控制器:
def create
@event = Event.find(params[:event_id])
@comment = @event.comments.create(params[:comment].permit(:commenter, :body))
redirect_to event_path(@event)
end
def create
@venue = Venue.find(params[:venue_id])
@comment = @venue.comments.create(params[:comment].permit(:commenter, :body))
redirect_to venue_path(@venue)
end
我的创建评论视图:
<h2>Add a comment:</h2>
<%= form_for([@event, @event.comments.build]) do |f| %>
<p>
<%= f.label :commenter %><br />
<%= f.text_field :commenter %>
</p>
<p>
<%= f.label :body %><br />
<%= f.text_area :body %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
答案 0 :(得分:2)
这是多态关联的典型例子。
为了让它正常工作,会有一些调整。
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
...
end
class Venue < ActiveRecord::Base
has_many :comments, as: :commentable
...
end
class Event < ActiveRecord::Base
has_many :comments, as: :commentable
...
end
这将添加到您的注释模型另一个名为commentable_type的属性,因此您可以区分每个模型的注释类型(场地,事件)
您必须运行看起来与此类似的迁移
def change
create_table :comments do |t|
t.integer :commenter
t.text :body
t.integer :commentable_id
t.string :commentable_type
t.timestamps
end
end
现在,当您迁移时,您可以转到rails console
并查看是否尝试
Venue.first.comments << Comment.create!(:body => "Body", :commenter => "Guy") # or commenter => 1 depending on your schema
它将作为评论保存到数据库中,您也可以对Event
至于你的评论控制器,我建议不要创建一个全局注释控制器,而是遵循RESTful方法并让每个控制器处理他的评论。
即
# routes.rb
resources :venues
resources :comments
end
resources :events do
resources :comments
end
这样你就可以根据每个控制器(场地/事件)调整你的视图,你可以按照RESTful方法,因为你可以使用HTML / JSON / XML,你可以获得更好的路径
/events/1/comments # index for all the comments for event 1
/events/1/comments/new # your add a comment form
同样适用于场地。
您可以在此处找到有关关联的更多信息http://guides.rubyonrails.org/association_basics.html#polymorphic-associations
祝你好运!