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



我正在开发Rails3.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等URL。但是,我想公开一个API,用于向不同类型的小部件添加注释。我希望那些API的URL看起来像:

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

然而,我可以拥有一个ShinyWidgetsController和一个DullWidgetsCoontroller,但我只想创建一个CommentsControllers。由于我还没有想到一种很好的方法来使用一个CommentsController来处理不同类型小部件的注释,我尝试了一下:

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

当对/widget/: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])

有什么想法吗?

目前这是非常错误的。

为了使其正常工作,您应该创建一个类似的路线

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

最新更新