【发布时间】:2010-02-17 11:25:13
【问题描述】:
我很难找到对动态字段进行编程的正确方法。例如:我有两个单选按钮,根据用户选择一个单选按钮的方式,它使用不同的字段扩展表单。
开始形式: - 单选按钮:汽车 - 单选按钮:船 - 文本字段:名称
如果用户单击单选按钮“汽车”,则表单将扩展为文本字段,例如。 “engine”、“color”,如果用户选择单选按钮“ship”,表单会扩展为“length”、“weight”等文本字段。属性引擎、颜色、长度、重量是表机数据库中的字段。
我的问题是,如果验证返回错误会发生什么。我如何使用部分来解决我的问题。我已经尝试过 remote_function(替换 html 部分)、partials 和 rjs,但 rails 会返回 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”,在这里我测试了不同的解决方案,比如隐藏和显示两个不同的 div,其中包含 car 或 ship 字段。此解决方案运行但在提交时发送所有哈希字段,而不仅仅是用户使用单选按钮选择的这些字段。第二个问题:如果提交返回验证错误,如何识别正确的字段?
另一个解决方案是使用 remote_function(调用例如 check_fields)和部分(代码发布在上面)!有了这个解决方案,我在 rjs 上得到了 NameErros,因为 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”!
有什么想法吗? 提前谢谢
【问题讨论】:
标签: ruby-on-rails dynamic attributes nested field