2010-02-17 152 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”