我有一个rails应用程序,其管理员模型包含许多用户和用户has_and_belongs_to_many
材料。问题是,对于特定用户(例如user/show/2
),我在该页面上有一个表单,该表单会发布到材料create
操作。在创建动作中,这是我想要做的事情
def create
@material = @user.materials.create(material_params)
end
但是,它不起作用,因为@user
是nil
。这需要通过users_materials
表将材料与用户相关联(因为has_and_belongs_to_many
关联)。那么,我如何定义用户页面(user/show/:id
)中的材料并能够为该用户定义材料?在rails中执行此操作的好方法是什么?
答案 0 :(得分:1)
听起来好像你拥有的是嵌套资源。
有一个关于他们的RailsCast here,他们在this guide中进行了讨论。
快速版本是您将大致如此定义您的路线:
resources :users do
resources :materials
end
表单将POST到/users/:user_id/materials
,我相信你称之为users_materials_path(@user)
。
控制器操作(MaterialsController#create
)将能够引用params[:user_id]
,并且可以简单地将其指定为user_id
的{{1}},或者实际加载用户(Material
),然后在其上调用User.find(params[:user_id]
。