Проблема:
Из учебника, как упоминалось выше, я подумал, что мне нужно иметь метод "update_city_select" в контроллере контактов. Затем при маршрутизации считалось, что следует выбрать элемент из записей контактов, а не записи о стране.
Решение:
Решение для правильного отображения Ajax было мной: 1) для вложения ресурсов стран, 2) перемещения метода в контроллер стран, 3) создания частичного "_cities.html.erb" в представлениях стран, 4) незначительного изменения форма и JS.
Я разместил ниже весь код для тех, кто может столкнуться с подобными проблемами или нуждается в ответе о том, как заставить работать динамический выбор.
Примечание: я использую рельсы 3.1 с JQuery и НИКАКИМ конструктором форм или драгоценными камнями
Модели
class Contact < ActiveRecord::Base
belongs_to :city
belongs_to :country
attr_accessible :name, :country_id, :city_id
end
class Country < ActiveRecord::Base
has_many :cities, :dependent => :destroy
has_many :contacts
attr_accessible :name, :city_id
end
class City < ActiveRecord::Base
has_many :contacts
belongs_to :country
attr_accessible :name, :country_id
end
Для контроллеров , просто создайте обычный формат restful и просто добавьте к country_controller следующий метод
def update_city_select
@cities = City.where( :country_id => params[:id]).order(:name) unless params[:id].blank?
render :partial => "cities", :locals => { :cities => @cities }
end
Для "Views / contacts / new.html.erb" вам потребуется 2 вещи: включить collection_select для стран и для ссылки на частичное , который будет помещен как "views / country / _cities.html.erb" . У меня также есть дубликат части _cities в представлениях контактов.
Вид / контакты / new.html.erb
<%= form_for(@contact) do |f| %>
<div class="field">
<%= f.label :country %>
<%= f.collection_select :country_id, @countries, :id, :name, :prompt => "-- Select a country --" %>
</div>
<div id="cities" class="field">
<%= render 'cities' %>
</div>
<% end %>
Вид / страны / _cities.html.erb
<%= label_tag :city %>
<% unless @cities.blank? %>
<%= collection_select(:contact, :city_id, @cities, :id, :name, :prompt => true )%>
<% else %>
<%= select_tag "city_id","city_id", :prompt => "-- Select a city --" %>
<% end %>
Затем создайте Ajax-вызов в своем application.js файле
jQuery(function($) {
// when the #region_id field changes
$("#contact_country_id").live('change', function() {
// make a POST call and replace the content
var country = $('select#contact_country_id :selected').val();
if(country == "") country="0";
jQuery.get('/countries/update_city_select/' + country, function(data){
$("#cities").html(data);
})
return false;
});
})
Последний цикл - убедиться, что вы можете получить доступ к ресурсам стран из контактной формы. Для этого вам просто нужно вложить ресурсы ваших стран в ресурсы контактов. Вам также нужно будет сделать запрос Get Get для вашего update_city_select следующим образом:
routes.rb
resources :cities
resources :countries
resources :contacts do
resources :countries
end
get '/countries/update_city_select/:id' => 'countries#update_city_select'
Спасибо за поддержку, Болдрик и Владимир
Орельен