У меня есть модель Категория has_many: подкатегории
Я использую код для заполнения раскрывающегося значения подкатегорий в соответствии со значением раскрывающегося списка категорий в представлении с использованием Ajax. Вот код:
_form.html.erb
<%= f.select :category_id, @categories, {}, :tab_index => 4, :onchange => "#{remote_function(:url => {:action => "populate_subcategories"},
:with => "'category_id='+value")}" %>
<div id = "subcategories_div">
<%= render :partial => "subcategories", :object => @subcategories %>
</div>
deals_controller.rb
def new
@deal = Deal.new
@categories = Category.all.map { |category| [category.name, category.id]}
@subcategories = @categories.first.subcategories.map { |subcategory| [subcategory.name, subcategory.id] }
end
def populate_subcategories
subcategories = Subcategory.where(:category_id => params[:category_id]).map { |subcategory| [subcategory.name, subcategory.id] }
render :update do |page|
page.replace_html 'subcategories_div', :partial => 'subcatgories', :object => subcategories
end
end
и, наконец, _subcategories.html.erb
<%= f.select :subcategory_id, subcategories, {}, :tab_index => 5 %>
Мой вопрос в коде page.replace_html 'subcategories_div', :partial => 'subcatgories', :object => subcategories
почему мы определяем подкатегории как локальные переменные и передаем их как объекты в частичные? Мы могли бы написать так
def populate_subcategories
@subcategories = Subcategory.where(:category_id => params[:category_id]).map { |subcategory| [subcategory.name, subcategory.id] }
render :update do |page|
page.replace_html 'subcategories_div', :partial => 'subcategories'
end
end
используйте @subcategories в качестве переменной экземпляра, чтобы она была доступна в частичном порядке, как в случае обычных представлений в Rails.
Также в _subcategories.html.erb
<%= f.select :subcategory_id, @subcategories, {}, :tab_index => 5 %>
и в _form.html.erb
<div id = "subcategories_div">
<%= render :partial => "subcategories" %>
</div>
Почему первый метод предпочтительнее второго? Это потому, что у нас есть только одна переменная для передачи в частичное? Есть ли улучшение производительности для первого метода?