我正在研究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 /widgets
,GET /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])
有什么想法吗?
答案 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