![](/img/trans.png)
[英]Comments for many different models: polymorphic or not? (Ruby on Rails)
[英]Create comments for two models from comments controller ruby on rails
Ruby on Rails新手,我以前一直在使用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 %>
这是多态关联的经典示例。
需要进行一些调整才能使其正常工作。
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方法,并让每个控制器处理他的注释。
IE
# 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
祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.