【问题标题】:Rails 4 new form defaults from paramsRails 4 来自 params 的新表单默认值
【发布时间】:2015-04-29 14:05:10
【问题描述】:

我在_form.html.erb 视图中使用form_for,以便按照标准脚手架为编辑和新操作创建表单。

我有一个拥有_many宠物的模型所有者。

我想在我的views/owners/show.html.erb 上添加一个 html 链接,以便为上述主人创建一只新宠物。此链接将指向 pets_controller.rb 的新操作,访问该操作时将呈现 pets/new.html.erb 中的视图

我想要将owner_id 与url 中的链接一起传递给pets_controller.rb 的新操作,然后用作pets/new.html.erb 中的collection_select 的默认值

所以我有一个创建新宠物的链接,但由于该链接位于特定的所有者页面上,我希望创建新宠物的表单已经设置了该所有者,因此用户不必从列表。

这必须在不改变宠物中编辑操作/视图的行为的情况下完成。

我知道我可以传递 GET 参数,然后通过参数在控制器中访问它们,然后在传递给视图的操作中创建变量。然后我可以手动检查默认值并将其设置在视图中。如果这是唯一的解决方案,我在编码方面不需要帮助。

有没有更好的方法来做到这一点?一种我可以传递参数的格式,以便视图只会拾取它们?无需手动编辑我的控制器和视图?

【问题讨论】:

  • 我想您可以将 Owner 数据放入会话或 cookie 中,然后通过 AJAX 查找在 form 页面上获取它。虽然看起来很迂回,但我会选择你提供的解决方案。

标签: ruby-on-rails forms ruby-on-rails-4


【解决方案1】:

虽然我个人倾向于按照您所说的去做,并在链接帮助程序中传递一个参数,然后在宠物视图中访问 params 数组,但您可能会发现这是探索Nested Resources 的绝佳机会。本质上,您可以使用以下命令声明 owner/:owner_id/pets/:pet_id 路由:

resources :owners do
  resources :pets
end

然后您可以链接到此路由,并引用 :owner_id 而无需将查询字符串附加到 URI(使重用更加简洁)。

这可能更适合您,但也可能更具可扩展性(当然更符合 Rails 的处理方式)。

修订

向 cmets 添加了以下有关链接帮助程序的内容,但也希望在答案中反映出来。

要显示宠物应该是:

<%= link_to owner_pet_path( owner_variable, pet_variable) %>

查看宠物的索引索引应该是:

<%= link_to owner_pet_path( owner_variable ) %>

to this question 给出的答案太棒了。

【讨论】:

  • 谢谢,这看起来很有趣。我会试试的。
  • 我认为应该是resources :owners do 对吗?
  • 是的,我很抱歉(现在修改答案)
  • 这一切都完全按照我的需要工作,所以谢谢。最后一部分,如果可以的话,在这个嵌套路由中使用 link_to 的正确方法是什么?
  • 很高兴听到这个消息!显示宠物应该是:&lt;%= link_to owner_pet_path( owner_variable, pet_variable) %&gt; 要查看宠物的索引索引应该是:&lt;%= link_to owner_pet_path( owner_variable ) %&gt; 给出的答案to this question 太棒了。我希望这能解决任何问题!
【解决方案2】:

正如@ConnorCMcKee 建议的那样,考虑嵌套你的路线是明智的。但是,如果您像我一样是初学者,我发现它有助于我学习将我的第二个控制器简单地嵌套到第一个控制器中(即,将 PetsController 嵌套到 OwnersController 中)作为第一步。然后我会继续路线。

方法类似于:

1./ 在 owners/index.html.erb 中:

PetsController 索引操作的链接

完成这项工作的关键是在您的链接参数中发送:owner_id。然后该 Pets 索引操作将有权访问该 :owner_id 并知道哪个 :owner_id 调用了它。

2./ 在 PetsController 中,您将能够使用该 ID 找到所有者,如下所示:

params[:owner_id]

然后,您的行动就可以开始利用了解所有者对他们的称呼。请记住,您在 PetsController 中的所有重定向都需要保留 params[:owner_id]。那是因为一旦你进入了那个嵌套结构,你就必须维护它并留在它里面,并且始终知道你正在使用哪个:owner_id

【讨论】:

  • 感谢您抽出宝贵时间回复。我会记住这种方法,以防出现其他问题,尽管对于这个简单的例子,上面@ConnorCMcKee 的回答已经解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 2014-05-18
  • 2017-08-24
  • 1970-01-01
相关资源
最近更新 更多