1

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 %>
4

1 回答 1

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 方法并让每个控制器处理他的评论。

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

祝你好运!

于 2013-10-06T12:55:03.490 回答