Rails控制器操作:自定义params散列中的键

时间:2012-07-12 11:49:09

标签: ruby-on-rails

我正在研究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

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

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

但是,我没有ShinyWidgetsController和DullWidgetsController,但我只想创建一个CommentController。由于我没有想过让单个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

我知道如果使用resources :comments Rails会将params哈希中的密钥更改为comment,但是我可以告诉Rails在我当前设置的情况下将该密钥命名为什么?

目前我必须创建一个类似这样的评论:

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

我真的很想:

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

有什么想法吗?

1 个答案:

答案 0 :(得分: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