【问题标题】:What does f.object do in the Rails form builder?f.object 在 Rails 表单构建器中做了什么?
【发布时间】:2017-01-09 21:03:48
【问题描述】:

我正在从教程中学习 Rails 5.0,在该教程中它使用了我不熟悉的 f.objectf.object 被传递到 ERb 中,传递到处理错误处理的方法中。

我知道f 是传递到表单中的记录的对象/实例。但是我不明白的是f.object

edit.html.erb(带表格的文件):

<%= form_for(@section) do |f| %>

<%= error_messages_for(f.object) %>
  <table summary="Subject form fields">
    <tr>
      <th>Name</th>
      <td><%= f.text_field(:name) %></td>
    </tr>
    <tr>
      <th>Position</th>
      <td><%= f.select(:position, 1..@subject_count) %></td>
    </tr>
   </table>
<% end %>

没有称为object 的HTML 表单元素,而这通常是在f. 之后出现的,所以真的很讨厌它可能是什么。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-5


    【解决方案1】:

    f.object 指的是作为参数传递给form_for 方法的对象。

    在您的示例中,f.object 返回 @section

    【讨论】:

      【解决方案2】:

      f”是表单块中使用的局部变量。该表单包含一个对象(@section),如果发生错误,您将该对象传递给一个错误部分,该部分检查是否存在任何错误并呈现该对象为您创建的错误消息。 在我的表单中,我通常会像这样添加一个错误部分:

        <%= render "shared/error_messages", object: f.object %>
      

      在您的错误部分中,它看起来有点像这样 (_error_messages.html.erb):

      <% if object.errors.any? %>   # object in this case is @section
        <ul>
          <% object.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
          <% end %>
        </ul>
      </div>
      <% end %> 
      

      这实际上只是一种将带有错误的表单对象传递给局部以正确显示它的方法。不涉及 html。

      【讨论】:

        【解决方案3】:

        thesetwo问题中所述:

        form_for 内的f.object 返回表单正在使用的模型对象。

        在这种情况下:@section

        代码是here,里面是rails/actionview/lib/action_view/helpers/active_model_helper.rb,显然没有cmets:

            module ActiveModelInstanceTag
              def object
                @active_model_object ||= begin
                  object = super
                  object.respond_to?(:to_model) ? object.to_model : object
                end
              end
              ...
        

        【讨论】:

          【解决方案4】:

          总结:f.object是你正在使用的记录:@section

          好的,你还在吗?在我快速浏览了源代码之后,这里对发生的事情进行了更多的解释:

          fform builder object。表单构建器有一个@object 实例变量。如果您在 form_for 中使用记录,则该记录将变为 @object。如果您在使用 form_for 时使用字符串,则 f.object 应该为 nil。但是在您的情况下,您正在使用记录,因此 f.object 将成为记录。

          恕我直言,我无法遵循当前接受的答案中的执行路径。当您使用form_for 方法时,object passed in is simply the first parameter passed in 就是is used to create the form_builder object,然后用于实例化@object 变量。

          【讨论】:

            猜你喜欢
            • 2012-10-19
            • 2013-03-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-01
            • 1970-01-01
            相关资源
            最近更新 更多