在Rails中使用partials

时间:2014-01-16 00:08:18

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

我正在关注this official guide以了解有关构建博客的Rails,我注意到它似乎并不完整。

On Point 5.13“使用partials清理视图中的重复”,它建议使用表单创建一个帖子并在局部内编辑它,因为两者都非常相似。它确实谈到了两种形式使用的路线的一个小差异,但它说这是一个将在后面解释的问题

  

除了form_for声明之外的所有内容都保持不变。 form_for如何在构建表单时找出正确的操作和方法属性将在稍后解释。 [...]

但是我注意到指南从未真正解释过如何做到这一点。 (也许他们只是忘了......?)

有人可以解释我如何解决这个问题?

3 个答案:

答案 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   记录自己。

基本上,您需要:

  1. 使用form_for帮助
  2. 将模型对象传递给它(而不是符号)
  3. routes.rb f.i中定义了资源。 resources :posts
  4. 因此,如果您有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| %>