私の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));
}
前もって感謝します