【问题标题】:Ruby on Rails nested dynamic fieldsRuby on Rails 嵌套动态字段
【发布时间】: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


    【解决方案1】:

    开始吧。 'f' 是表单的名称。 对于您的部分,第一种形式是“komplex_object”的整体形式。

    然后,您有一个子表单,即“machine_f”表单。 在分部中,您可以通过以下方式将该次要形式作为新的局部变量传递给分部,该变量也称为“f”(在子分部中):

    :locals => { :f => machine_f }
    

    部分只是有一个名为“f”的变量,这是您将所有字段添加到的变量。


    其次。您所有的表单打开/关闭问题都应该只能用 javascript 来解决。

    解决这个问题的最好方法是从页面上所有存在和可见的表单开始(即,如果用户点击“汽车”应该显示什么如果用户点击“发货”。

    然后使用 javascript 函数隐藏当前不相关的函数。 例如,它将查看单选按钮 - 如果单击“radio-ship”按钮,则 js 会隐藏“car partial”,反之亦然。

    这还有一个额外的好处,如果有人没有 javascript(或者它坏了),那么至少它会失败而不是失败。

    让我知道这是否足以让您接受 - 但这是您解决方案的总体基础。


    第三,您遇到错误问题的原因是您将它们全部显示在页面顶部的一大块中 - 将“komplex_object”以及相关对象的所有错误都集中在一个大斑点。

    您实际上可以在子表单中放置特定子模型(例如汽车或船舶)的错误消息。

    查看“error_messages_for”而不是“f.error_messages”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 2018-12-28
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多