2017-01-09 72 views
4

我正在學習一個教程的Rails 5.0,在那個教程中它使用了我不熟悉的f.object。將f.object傳遞給ERb,轉換爲處理錯誤處理的方法。f.object在Rails表單生成器中做了什麼?

我知道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, [email protected]_count) %></td> 
    </tr> 
    </table> 
<% end %> 

沒有被稱爲object HTML表單元素,而這就是f.以後有什麼一般無二,於是真的就可能是什麼惱火。

回答

3

f.object引用作爲參數傳遞給form_for方法的對象。

在你的例子中f.object返回@section

3

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。

2

thesetwo問題解釋:

f.objectform_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 
     ...