[英]Using partials in Rails
我正在遵循此官方指南来学习有关Rails的信息,在该地方已构建了博客,并且我发现它似乎还不完整。
在第5.13点“使用局部视图清除视图中的重复项”上,建议使用该表格来创建帖子并在局部视图中进行编辑,因为两者是如此相似。 它确实说明了两种形式都使用的路线之间的细微差别,但是它说这是一个问题,稍后将进行解释。
除了form_for声明外,其他所有内容均保持不变。 稍后将解释form_for如何在构建表单时找出正确的操作和方法属性。 [...]
但我注意到该指南从未真正说明如何执行此操作。 (也许他们只是忘记了...?)
有人可以解释我该如何解决这个问题?
如果遵循Rails约定,则无需执行任何操作。 在文档( http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for )中对此进行了很好的解释。
但是,如果传递给form_for的记录是一种资源,即它对应于一组RESTful路由,例如使用config / routes.rb中的resources方法定义,则可以进一步简化。 在这种情况下,Rails会简单地从记录本身推断出适当的URL。
基本上,您需要:
form_for
助手 routes.rb
网络resources :posts
因此,如果您具有form_for(@post)
,Rails将通过检查@post
是否为新记录来确定要使用的路由。
如果您想要一个完整的示例,只需创建一个新的Rails应用并创建任何脚手架:
rails g scaffold User name
您可以检查Rails是否在部分表单中放置了表单: app/views/users/_form.html.erb
。
如果要深入研究,请检查源代码。 有趣的部分在此文件中 。
action, method = object.respond_to?(:persisted?) && object.persisted? ? [:edit, :patch] : [:new, :post]
在我们的示例中, @post
被分配给object
。 Rails充满了这样的捷径,有时了解它们的最佳方法是查看源代码。 如果您对Ruby熟悉,您通常会发现源代码是文档和指南的更好解释。
<%= form_for @product do |f| %>
.
.
.
<% end %>
当@product是新记录时,Rails会知道它并使用products_path。 但是,当@product存在时,Rails使用product_path(@product)。
它并不能很好地解释它。 如果您在表单的两个版本中查找页面,一个用于new
,一个用于edit
您会看到它们在form_for
之后有两个不同的代码段,但是它们都传递了@post
变量。 在第一种情况下,变量包含一个新的空Post
对象。
<%= form_for :post, url: posts_path do |f| %>
在edit
版本中,它正在查找记录,将其放入@post
变量中并将其传递给表单。
<%= form_for :post, url: post_path(@post), method: :patch do |f| %>
最终版本(部分版本)没有额外的代码来指示它是new
动作还是edit
。 但是由于URL和调用视图的操作的缘故,Rails知道使用部分表单时将哪些代码包含在表单中。 更多“ Rails魔术”。
<%= form_for @post do |f| %>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.