我在form_for
视图中使用_form.html.erb
,以便根据标准支架为编辑和新操作创建表单。
我有一个拥有宠物的模特老板。
我想在我的views/owners/show.html.erb
上添加一个html链接,为所有者创建一个新宠物。此链接将指向pets_controller.rb
的新操作,访问该操作时将在pets/new.html.erb
我想要发生的是owner_id
将url中的链接传递给pets_controller.rb
的新操作,然后用作{{1}中collection_select的默认值}}
所以我有一个创建新宠物的链接,但由于该链接位于特定的所有者页面上,我希望该表单创建一个新的宠物以使该主人已经设置,因此用户无需从中选择列表。
必须在不改变宠物中编辑操作/视图的行为的情况下完成此操作。
我知道我可以传递GET参数,然后通过params在控制器中访问它们,然后在动作中创建传递给视图的变量。然后我可以手动检查默认值并在视图中设置它。如果这是唯一的解决方案,我不需要编码方面的帮助。
有更好的方法吗?我可以使用一种格式传递参数,以便视图可以接收它们?没有手动编辑我的控制器和视图?
答案 0 :(得分:2)
虽然我个人倾向于按照你的说法去做并在链接助手中传递一个参数,然后在宠物视图中访问params数组,你可能会发现这是探索Nested Resources的绝佳机会。基本上,您可以使用:
声明所有者/:owner_id / pets /:pet_id路由resources :owners do
resources :pets
end
然后,您可以链接到此路由,并引用:owner_id,而无需将查询字符串附加到URI(使重用更加清晰)。
这可能对您有更多的帮助,但也可能更具可扩展性(当然更多的是与Rails的做事方式一致)。
在评论中添加了以下关于链接助手的内容,但也希望在答案中反映出来。
要显示宠物应该是:
<%= link_to owner_pet_path( owner_variable, pet_variable) %>
观看宠物&#39;索引索引应为:
<%= link_to owner_pet_path( owner_variable ) %>
给出的答案to this question太棒了。
答案 1 :(得分:1)
正如@ConnorCMcKee所建议的,考虑嵌套你的路线是明智的。但是,如果你是我自己的初学者,我发现它帮助我学习简单地将第二个控制器嵌入第一个控制器(即将PetsController嵌套到OwnersController中)作为第一步。然后我会继续路线。
该方法类似于:
1. /在 owners / index.html.erb :
指向PetsController索引操作的链接
使这项工作的关键是在您的链接参数中发送:owner_id
。然后,Pets index操作可以访问:owner_id
并知道:owner_id
调用它。
2. /在 PetsController 中,您可以使用该ID找到所有者,如下所示:
params[:owner_id]
然后你的行动可以开始利用知道所有者称之为什么。请记住,您的PetsController中的所有重定向都需要保留params[:owner_id]
。这是因为一旦你进入嵌套结构,你必须保持它并留在里面,并始终知道你正在使用哪个:owner_id
。