![](/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.