我正在开发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 /widgets
、GET /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