2010-02-17 151 views
1

我有一個問題找到編程動態字段的正確方法。例如:我有兩個單選按鈕,取決於用戶如何選擇一個單選按鈕,它將擴展窗體的不同字段。Ruby on Rails嵌套動態字段

啓動形式: - 單選按鈕:汽車 - 單選按鈕:船 - 文本字段:姓名

如果用戶點擊單選按鈕「車」的形式獲取與例如像文本字段延長。 「引擎」,「顏色」,並且如果用戶選擇單選按鈕「船」,則表單將被擴展爲具有諸如「長度」,「重量」的文本字段。屬性引擎,顏色,長度,重量是臺式機上數據庫中的字段。

我的問題是,如果驗證返回錯誤會發生什麼。我如何使用partials來解決我的問題。我已嘗試remote_function(以取代HTML部分),partials和rjs,但軌道返回我NameErrors!

我的形式看起來像這樣:

<% form_for(@komplex_object, :url => some_url) do |f| %> 
    <%= f.error_messages %> 
    <% f.fields_for :machine do |machine_f| %> 
     <%= machine_f.radio_button :kind, 'car', :onclick => some_request_or_javascript, :checked => true -%> Car 
     <%= machine_f.radio_button :kind, 'ship', :onclick => some_request_or_javascript -%> Ship  
     <div id="dynamic_fields"> 
      <% render :partial => 'car', :locals => { :f => machine_f } %> 
     </div> 
    <% end %> 

    <p><%= f.label :name %> 
    <%= f.text_field :name %></p> 
    ... 
<% end %> 

注意:本機屬性嵌套在komplex_object表格內!

這裏諧音:

# _car.html.erb 
<p><%= f.label :engine %> 
<%= f.text_field :engine %></p> 
<p><%= f.label :color %> 
<%= f.text_field :color %></p> 

# _ship.html.erb 
<p><%= f.label :length %> 
<%= f.text_field :length %></p> 
<p><%= f.label :weight %> 
<%= f.text_field :weight %></p> 

在窗體我有寫「some_request_or_javascript」,在這裏我有測試不同的解決方案,如JavaScript這就是隱藏和顯示兩個不同的div包含汽車或船場。此解決方案運行,但在提交時發送所有散列字段,而不僅僅是用戶使用單選按鈕選擇的這些字段。第二個問題:如果提交返回驗證錯誤,如何識別正確的字段?

另一種解決方案是使用remote_function(即調用例如check_fields)和partials(CODE POSTED above)!有了這個解決方案,我得到的,因爲page.replace_html功能

# controller function that remote function calls 
# Ajax update for the right fields 
def check_fields 
    respond_to do |format| 
      format.js { render :action => params[:kind] } 
    end 
end 

# ship.js.rjs 
page.replace 'dynamic_fields', :partial => 'ship' 

不明白在部分_ship.html.erb的「F」的RJS NameErros!

有什麼想法? thx提前

回答

0

開始。 'f'是表單的名稱。 對於您的部分,第一種形式是「komplex_object」的整體形式。

然後,你有一個子表單,它是你的「machine_f」形式。 在局部,你那麼二次形式使用傳遞到部分作爲新的局部變量,也被稱爲「F」(在子局部):

:locals => { :f => machine_f } 

的,部分只是有一個名爲「f」的變量,就是你添加所有字段的內容。其次。


其次。所有你的表單開啓/關閉的困境只能用javascript來解決。

解決這個問題的最好方法是從頁面上顯示的所有表單開始(即,如果用戶點擊「汽車」應顯示的內容如果用戶點擊「發送「

然後使用javascript函數隱藏當前不相關的那個 例如它將查看單選按鈕 - 如果單擊」radio-ship「按鈕,則js隱藏」car partial 「,反之亦然

這也有附加的好處,如果有人不 javascr ipt(或它破壞),那麼至少它會失敗 - 有用而不是失敗 - 無用。

讓我知道如果這足以讓你去與 - 但這是你的解決方案的整體基礎。


第三,爲什麼你有一個錯誤的問題的原因是,你在頁面的頂部顯示他們都在一個大的塊 - 讓所有的錯誤,對於「komplex_object」以及相關將所有對象都放在一個大塊中。

實際上,您可以在子表單中爲特定的子模型(例如汽車或船舶)提供錯誤消息。

看看「error_messages_for」而不是「f.error_messages」