【问题标题】:Ruby on Rails: Are "form_for(:product, ...)" and "form_for(@product, ...)" equivalent?Ruby on Rails:“form_for(:product, ...)”和“form_for(@product, ...)”是否等效?
【发布时间】:2010-12-14 07:25:51
【问题描述】:

<%= form_for(:product, :url => {:action => 'update', :id => @product.id})) do |f| %>
  ...
<% end %>

<%= form_for(@product, :url => {:action => 'update', :id => @product.id})) do |f| %>
  ...
<% end %>

一模一样?

【问题讨论】:

    标签: ruby-on-rails forms form-for ruby-on-rails-3


    【解决方案1】:

    form_for 助手中的@product 附带更多功能。

    :product 只影响输入字段的 id 和 name。例如,您在表单中提交了一个文本:

    <%= form_for :product, :url => {...} do |f| %>
      <%= f.text_field :price %>
    <% end %>
    

    生成的 html 如下所示:

    <input type="text" id="product_price" name="product[price]" />
    

    idname 值由 :product.to_s 和文本字段名称确定。

    如果您使用@product,则不需要:url,因为网址将根据@product的状态确定:

    • 如果@product 是新记录,则url 将发布到create
    • 否则,该网址将发布到update

    并且输入字段的 id 和 name 受@product 的类名影响,因此在使用单表继承时这一点很重要。输入字段的值自动分配有@product 的属性值。因此,如果您使用@product,则 html 输出将如下所示:

    <input type="text" id="product_price" name="product[price]" value="some value" />
    

    假设@product的类名是Item,那么输出会变成:

    <input type="text" id="item_price" name="item[price]" value="some value" />
    

    当然你可以同时使用:product@product

    <%= form_for :product, @product do |f| %>
    

    :product 控制输入字段的名称和 ID,@product 控制 url 和输入字段的值。

    【讨论】:

    • :product 也会影响form_for 生成的URL。
    • 是的,但我从不使用符号参数而不分配:url。实际上这个符号很少单独使用。
    • 当我使用form_for(:product, ...) 时,我确实看到填充了@product 值的文本字段。但是,选择框获取默认值(第一个选项)。你知道有什么问题吗?另请参阅:stackoverflow.com/questions/4436267/…
    • @Misha:我已经回答了你的问题 :)
    【解决方案2】:

    类似,但不一样。当您使用 @product 时,您可以从模型实例中自动将值填充到表单字段中。

    例如,如果您在控制器中的操作 :new 中分配 @product,如下所示:

    @product = Product.new
    

    那么生成的表单可能不会有任何差异。但是,如果你在你中跟进这个:创建这样的操作:

    @product = Product.new(params[:product])
    if @product.save
      ...
    else
      render :action => :new
    end
    

    然后,如果它无法保存 @product 实例,那么它将呈现与 :new 中相同的表单,但这次将使用发布的值填充所有字段。如果您使用 :product

    ,那将是不可能的

    【讨论】:

    • 你研究过这个吗? :product 对我来说采取了同样的方式:/products/new。与编辑页面相同:/products/1/edit。我只是对您的回答感到困惑,仅此而已。这与我在我的研究中实际看到的相矛盾。
    • 我想我们可能在考虑不同的事情。具体路线我没有提到,只是描述了两种不同场景使用时表格内的差异。在这种情况下,new 和 create 的示例可能不合适,但这只是您如何从使用实例而不是符号中受益的一个示例。
    • :product 也会为我填充文本字段,就像 @product
    • 真的吗?填充什么值?除非您手动分配值,否则我看不到 :product 如何知道来自@product 的值。至少在我尝试时不起作用。
    【解决方案3】:

    form_for 已经很长了。对您的问题的简短回答:@product 对于确定对可以包含许多对象的资源执行什么操作非常有用,这听起来就是这样。另一方面,:product 将始终执行相同的操作,update。这最适用于单一资源。可以在Routing Guide 中找到对资源的​​很好解释。 Getting Started 指南中也对此进行了说明。

    您的第二个 form_for 可能会被缩短为:

    <%= form_for @product do |f| %>
       ...
    <% end %>
    

    路由和入门指南中对所有内容进行了说明。

    另外,我在您的个人资料中看到您来自墨尔本。 Ruby on Rails Oceania Google 群组列出了全国各地的聚会。墨尔本每个月都会举办一场,您可能想参加一次,结识志同道合的人。

    【讨论】:

    • 我检查了FormBuilder 并发现它是实例变量@product 使符号:product 充当对象。如果您将@product 的文字名称更改为@myproduct,则该符号将无法生成url,以及分配字段值。所以我认为该符号仅用于控制字段的ID和名称,应与:url选项一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多