【问题标题】:How to create/destroy a nested_form with the change of a f.select如何通过更改 f.select 创建/销毁nested_form
【发布时间】:2013-03-26 16:43:39
【问题描述】:

在我的 Rails 应用程序中,我有以下代码 在views/patients/_form.html.erb中

 <div class="field">
    <%= f.label :sex %><br />
    <%= f.select :sex, [['Male','Female'],['Θ','1']] %>
  </div>



  <div>
   <%= f.fields_for :female_patient do |fp| %>
    <%=render   "female_patient_fields", :f => fp %>
  <% end %>
  </div>
   <p><%=link_to_add_fields "Add Female Info", f, :female_patient %></p>

部分代码是这样的
在views/patients/_female_patient_fields.html.erb

 =====FEMALE INFO=====
      <div class="field">
    <%= f.label :childbirths %><br />
    <%= f.number_field :childbirths %>
  </div>
  <div class="field">
    <%= f.label :last_period %><br />
    <%= f.datetime_select :last_period %>
  </div>

  <p>
  <%= link_to_remove_fields "remove", f %>
  </p>
    ====================================
  </div>


是指向应用程序助手的链接,它们为附加字段创建和销毁嵌套表单。

在 helpers/application_helper.rp 中

module ApplicationHelper
 def link_to_remove_fields(name, f)
    f.hidden_field(:_destroy) + link_to_function(name, "remove_fields(this)")
  end
def link_to_add_fields(name, f, association)
    new_object = f.object.class.reflect_on_association(association).klass.new
    fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
      render(association.to_s.singularize + "_fields", :f => builder)
    end
    link_to_function(name, "add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")")
  end

end

链接工作正常,嵌套表单被创建/销毁,female_patient 对象被正确创建(或不)。 (患者模型与 female_patient 具有 has_one 关系。

我想不通的是,当性别的 f.select 字段(第一种形式)发生更改时,一种调用助手操作的方法。我希望嵌套表单在所选值为女性时出现,并在所选值为男性时消失。

编辑:使用的 jquery 函数是:

function remove_fields(link) {
  $(link).prev("input[type=hidden]").val("1");
  $(link).closest(".female").hide();
}

function add_fields(link, association, content) {
  var new_id = new Date().getTime();
  var regexp = new RegExp("new_" + association, "g")
  $(link).parent().before(content.replace(regexp, new_id));
}

提前致谢

【问题讨论】:

    标签: ruby-on-rails ruby onchange


    【解决方案1】:

    您将使用 javascript(最有可能是 jquery)来显示/隐藏字段。您可以在女性患者字段周围的 div 上放置一个 id。然后,在您的 javascript 中,您甚至可以在性别选择框上附加一个 on change。然后更改事件的处理程序将确定是否显示/隐藏女性患者 div。

    $(function() {
      if($('#patient_sex').length) {
        $('#patient_sex').on('change', function() {
          if($(this).val() == '1') {
            $('#female_patient_fields').show(); // or w/e you want to call the div
          } else {
            $('#female_patient_fields').hide();
          }
        });
      }
    });
    

    在视图中:

    <div id="female_patient_fields">
      ... your form fields for 
    </div>
    

    【讨论】:

    • 我已经在使用 jquery(我编辑了我的问题),当我点击相应的创建/销毁链接时它工作正常,但我在 jquery(或 javascript 方面)非常糟糕,我不知道如何继续。
    • 我不明白添加/删除链接的必要性,因为 female_patient 信息是 has_one 关系而不是 has_many。我的建议,我给出的答案,是我认为你真正想做的,就是显示/隐藏那些字段。
    • 我尝试了您的解决方案,它部分有效。它正确显示/隐藏部分表单,但是现在当我创建具有额外字段的患者时,不会创建 female_patient 对象。而且我第一次进入患者/新页面时,在选择器上选择了男性值,并且出现了附加字段。所以我必须选择女性,然后再选择男性让他们消失。
    • 通过创建另一个与您的基本相同但无法控制选择器更改的 jquery 函数,我摆脱了第二个问题。但仍然没有创建 female_patient 对象。
    • 有没有办法从jquery函数内部调用helper中的函数??
    猜你喜欢
    • 1970-01-01
    • 2012-01-15
    • 2016-05-20
    • 2018-05-03
    • 2014-02-02
    • 1970-01-01
    • 2023-03-16
    • 2021-02-17
    • 1970-01-01
    相关资源
    最近更新 更多