0

私の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>

部分的なコードはこれです
ビュー/患者/_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>

<%=link_to_add_fields "女性情報を追加", f, :female_patient %>

および
<%= link_to_remove_fields "remove", f %> は、アプリケーション ヘルパーへのリンクであり、追加フィールドのネストされたフォームを作成および破棄します。

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 オブジェクトが適切に作成されます (または作成されません)。(患者モデルには、女性患者とのhas_one関係があります)。

私が理解できないのは、性別の f.select フィールド (最初の形式) が変更されたときにヘルパーのアクションを呼び出す方法です。選択した値が女性の場合はネストされたフォームが表示され、選択した値が男性の場合は非表示になります。

EDIT:使用される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));
}

前もって感謝します

4

1 に答える 1

0

フィールドを表示/非表示にするには、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>
于 2013-03-26T16:52:12.897 に答える