f.object在Rails表单构建器中做了什么?

时间:2017-01-09 21:03:48

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

我正在从一个教程学习Rails 5.0,在该教程中它使用f.object,我不熟悉。 f.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.之后通常会发生这种情况,所以对它可能是什么感到非常恼火。

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

&#34;的˚F&#34;是表单块中使用的局部变量。表单包含一个对象(@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。

答案 2 :(得分:2)

正如these two个问题中所述:

f.object内的

form_for返回表单正在使用的模型对象。

在这种情况下:@section

代码为here,位于rails/actionview/lib/action_view/helpers/active_model_helper.rb内,显然没有评论:

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

答案 3 :(得分:0)

摘要:Categorie.aggregate([ {$match: {leverancier: leverancier}}, { $lookup: { from: "voorraads", // collection of model Voorraad localField: "_id", foreignField: "categorie", as: "voorraad" } } ]) 是您正在使用的记录:@section

好的,你还在吗?在我快速浏览了源代码之后,这里有一些关于发生的事情的解释:

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

以最大的敬意,我无法遵循当前接受的答案中的执行路径。当您使用f.object方法时,form_for passed in is simply the first parameter passed in就是is used to create the form_builder object的内容,然后将其用于实例化object变量。