1

我正在开发 Rails 3.1.x 应用程序,我有以下一组模型:

class Widget
  include Mongoid::Document
  field :name
  embeds_many :comments
end

class ShinyWidget < Widget; end
class DullWidget < Widget; end  

class Comment
  include Mongoid::Document
  field :message
  embedded_in :widget
end

所以基本上我需要允许评论与不同类型的小部件相关联。在我的路线中使用标准资源,例如:

resources: widgets do
  resources :comments
end

这会公开诸如 、 等的 url GET /widgetsGET /widgets/:widget_id/comments但是,我想公开一个 API,用于向不同类型的小部件添加评论。我希望这些 API URL 看起来像:

GET /shinywidgets/:widget_id/comments
POST /shinywidgets/:widget_id/comments

但是,我可以拥有一个 ShinyWidgetsController 和一个 DullWidgetsController,但我只想创建一个 CommentsController。由于我还没有想到让一个 CommentsController 来处理不同类型小部件的评论的好方法,所以我尝试了这个:

resources :widgets do
  get 'comments', to: 'widgets#comments_index'
  post 'comments', to: 'widgets#comments_create'
end

当对 /widgets/:widget_id/comments 进行 POST 时,params哈希将发布的评论数据存储在一个名为widget而不是我希望的键中comment

我知道使用过的 Rails 是否会将散列resources :comments中的那个键更改为,但是我可以告诉 Rails 在给定我当前设置的情况下如何命名该键吗?paramscomment

目前我必须创建一个评论做这样的事情:

def comments_create
  widget = Widget.find(params.delete :widget_id)
  comment = widget.comments.create(params[:widget])
end

我真的很想拥有:

comment = widget.comments.create(params[:comment])

有什么想法吗?

4

1 回答 1

2

目前这是非常错误的。

为了使这项工作正常进行,您应该创建这样的路线

resources :widgets do
  get  'comments' => 'comments#index'
  post 'comments' => 'comments#create'
end

并且在发布到此内容时CommentsController,您在prams[:comment].

你的控制器会有这样的动作

def create
  widget = Widget.find(params.delete :widget_id)
  comment = widget.comments.create(params[:comment])
end
于 2012-07-12T12:08:39.620 回答