我正在关注this official guide以了解有关构建博客的Rails,我注意到它似乎并不完整。
On Point 5.13“使用partials清理视图中的重复”,它建议使用表单创建一个帖子并在局部内编辑它,因为两者都非常相似。它确实谈到了两种形式使用的路线的一个小差异,但它说这是一个将在后面解释的问题
除了form_for声明之外的所有内容都保持不变。 form_for如何在构建表单时找出正确的操作和方法属性将在稍后解释。 [...]
但是我注意到指南从未真正解释过如何做到这一点。 (也许他们只是忘了......?)
有人可以解释我如何解决这个问题?
答案 0 :(得分:5)
如果您遵循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
f.i中定义了资源。 resources :posts
因此,如果您有form_for(@post)
,Rails将通过检查@post
是否为新记录来确定要使用的路由。
如果您想要一个完整的示例,只需创建一个新的rails应用程序并创建任何支架:
rails g scaffold User name
您可以检查Rails是否已将表单放入部分:app/views/users/_form.html.erb
。
如果您想深入挖掘,请检查源代码。有趣的部分在this file。
action, method = object.respond_to?(:persisted?) && object.persisted? ? [:edit, :patch] : [:new, :post]
在我们的示例中,@post
已分配给object
。 Rails充满了这样的捷径,有时学习它们的最佳方式是查看源代码。如果您熟悉Ruby,您通常会发现源代码是对文档和指南的更好解释。
答案 1 :(得分:1)
<%= form_for @product do |f| %>
.
.
.
<% end %>
当@product是新记录时,Rails知道它并使用products_path。但是当@product存在时,Rails使用product_path(@product)。
答案 2 :(得分:1)
解释它并不是很好。如果您在表单的两个版本中查找页面,一个用于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| %>