Ошибка 404 для Dynamic Dropdown с рельсами 3.1 и Ajax (Jquery) - PullRequest
0 голосов
/ 14 января 2012

У меня проблемы с созданием динамических выпадающих меню, где:

Когда вы выбираете страну, она отображает часть с городами, которые принадлежат стране.

У меня есть модели Страна имеет_Многие города и Город принадлежит_Страна

С помощью firebug я получаю сообщение об ошибке при получении действия контроллера update_city_select, где он выбирает запись контакта вместо записи страны.

Я последовал примеру Питер Мак

Вот мой код:

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('/contacts/update_city_select/' + country, function(data){
        $("#cities").html(data);
    })
    return false;
  });
})

contacts_controller.rb

  def new
    @contact = Contact.new
    @industries = Industry.all
    @countries = Country.all
    @cities = City.where(["country_id = ?", 1]).all
    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @contact }
    end
  end
.
.
.
  def update_city_select
      @cities = City.where(:country_id => params[:id]).order(:name) unless params[:id].blank?
      render :partial => "cities", :locals => { :cities => @cities }
  end

контакты / _form.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

<%= fields_for @contact do |f| %>
    <%= f.label :city %>
    <% unless cities.blank? %>
        <%= f.collection_select :city_id, cities, :id, :name, :prompt => "-- Select a city --" %>
    <% else %>
        <%= f.select "city_id","city_id", :prompt => "-- Select a city --" %>
    <% end %>

<% end %>

routes.rb

  resources :cities
  resources :countries
  resources :contacts
  get '/contacts/update_city_select/:id' => 'contacts#update_city_select'

Ваша помощь в решении этой проблемы Ajax была бы очень признательна!

Орельен

1 Ответ

1 голос
/ 15 января 2012

Проблема:

Из учебника, как упоминалось выше, я подумал, что мне нужно иметь метод "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'

Спасибо за поддержку, Болдрик и Владимир

Орельен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...