2016-04-30 71 views
1

對不起這個noob問題,我只是無法理解的Ruby/Rails語法,對方法的返回值和參數做題後

在軌2.x中,我讀了下面的代碼,

def localized_input_form_for(record_or_name_or_array, *args, &proc) 
    options = args.extract_options! 
    args << options.merge(:builder=>LocalizedFormBuilder) 
    concat('<div class="inputbox">') 
    form_for(record_or_name_or_array, *args, &proc) 
    concat('</div>') 
end 

上述函數返回什麼?它不應該是最後一行語句concat('</div>')的返回值嗎?

在的意見,我也有,

<% localized_input_form_for(@customer) do |f| %> 

什麼是在上面的代碼中樓是相同˚F爲form_for(xx) do |f|

下面的代碼工作沒有問題,

<%= f.text_field :name, :required => true, :size => 30,:class =>'ime_on' %> 

在軌道4,我做了如下修改,

def localized_input_form_for(record_or_name_or_array, *args, &proc) 
    options = args.extract_options! 
    args << options.merge(:builder=>LocalizedFormBuilder) 
    concat('<div class="inputbox">'.html_safe) 
    concat(form_for(record_or_name_or_array, *args, &proc)) 
    concat('</div>'.html_safe) 
end 

無需添加CONCAT出來的form_for,而無需添加html_safe,原代碼只是沒有工作。現在

,一切仍然有效,該

<% localized_input_form_for(@customer) do |f| %> 

作品沒有問題,是完全一樣的前所示的形式。那麼現在這個函數的返回值是什麼?以及上面的f是什麼?

唯一不同的是,原來的選項

<%= f.text_field :name, :required => true, :size => 30,:class =>'ime_on' %> 

它們,必需:true,大小:30,和類: 'ime_on' 不顯示在最終的HTML!

生成下面,

<input type="text" value="abc" name="customer[name]" id="customer_name"> 

沒有大小,類等的選項。 rails 2.x生成的html確實有這些選項。

我只是對差異感到困惑。而且我也不明白爲什麼原始軌道2.x和軌道4都工作(| f |反映form_for生成的形式,所以f.text_field將從數據庫中獲得正確的值)。

+0

什麼類是嗎? – sawa

+0

該方法位於helper類中,位於「Module ApplicationHelper 」中。還有一個localized_form_builder助手,但我認爲它只是修改瞭如何生成標籤的方式,它不包含text_field上的任何代碼。 – user534498

+0

據我所知''concat'強制輸出到最終的渲染視圖,它不會被返回。這有點像瀏覽器的「puts」。 – tadman

回答

1

是的,你的方法會返回最後一行。在你的情況下,這是concat("</div>"),其計算結果僅爲"</div>"

問題是,concat沒有像您期望的那樣工作,因爲它不在文本緩衝區內發生,所以沒有什麼可以「連接」。

爲了解決這個問題,包你的助手在capture塊,像這樣:

def some_html 
    capture do 
    # ... 
    concat('<div class="inputbox">') 
    # ... 
    concat('</div>> 
    end 
end 

更多關於capture方法:http://apidock.com/rails/ActionView/Helpers/CaptureHelper/capture