Я использую метод Райана , чтобы динамически добавлять и удалять вложенные поля модели через JavaScript с помощью jQuery.
Есть 4 модели: клиент, c_person; проект, p_person. И связи «один ко многим»: у клиента много c_people, а в проекте много p_people (это люди со стороны клиента, но они принадлежат проекту).
Итак, у меня следующая проблема:
Когда я использую вспомогательный метод "link_to_add_fields" в моем представлении, мне нужно передать другой параметр (current_client_id), который зависит от того, какой клиент в данный момент выбран в поле выбора.
<!-- new.html.erb -->
<p>
<%= f.label :client_id %></br>
<%= f.collection_select :client_id, Client.order("title"), :id, :title %>
</p>
<p>
<%= f.fields_for :p_people do |builder| %>
<%= render "p_person_fields", :f => builder %>
<% end %>
</p>
<p><%= link_to_add_fields "Add Person", f, :p_people, current_client_id %></p>
Мне нужно, чтобы динамически изменить коллекцию для переменной @people в вспомогательном методе,
# application_helper.rb
def link_to_add_fields(name, f, association, current_client_id)
new_object = f.object.class.reflect_on_association(association).klass.new
@people = CPerson.where(:client_id => current_client_id).order(:name) unless current_client_id.blank?
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, h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"))
end
чтобы наконец использовать его частично:
<!-- _p_person_fields.html.erb -->
<div class="fields">
<p>
<%= f.collection_select :content, @people, :name, :name %>
<%= f.hidden_field :_destroy %>
<%= link_to_function "Remove", "remove_fields(this)" %>
</p>
</div>
Вот простая функция js для получения значения current_client_id, но я не знаю, как передать его в метод view или вспомогательный метод.
// application.js
function current_client_id() {
var current_client_id = $("select#client_id :selected").val();
}
Я ценю вашу помощь! Может быть, есть лучшее решение?