创建动态集合选择rails 3.1

时间:2012-05-22 10:13:39

标签: ruby-on-rails jquery ruby-on-rails-3.1 cascadingdropdown

我已经完成了N个用于在rails中创建动态下拉列表的解决方案,但似乎没有任何效果。

我有一个典型的州和城市模型,我不想使用卡门。

这是我的模特: -

Market.rb

class Market < ActiveRecord::Base
    attr_accessible :state, :cities_attributes

    has_and_belongs_to_many :users

    has_many :cities, :dependent => :destroy

    accepts_nested_attributes_for :cities

    validates :state, :presence => true, :uniqueness => true

end

City.rb

class City < ActiveRecord::Base
    attr_accessible :city

    belongs_to :market

    has_and_belongs_to_many :users

end

in devise / registrations / new(我希望用户在注册时选择州和城市)

%li
  =f.collection_select :city, Market.all,:id, :state, html_options = { :class => "custom_textarea"}
%li
 =render "devise/registrations/cities", :f => f

_cities.html.haml partial

-unless cities.blank?
    =f.collection_select( :city, @cities, :id, :cities)

registrations_controller.rb

def update_city_select
    @cities = City.where(:country_id => params[:id])
    render :partial => "cities", :locals => {:cities => @cities}
end

我想在用户选择州并填充相关城市后更改城市列表。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

您必须在视图中使用ajax,其中包含状态下拉列表:

$("#stateDropdown").change(function(){
  $.get("controller/update_city_select.html?id="+$("#stateDropdown").val(), 
        function(data){ $("#cityDropdownDiv").html(data); } );
});

这会调用您的操作,并将div的内容替换为城市的新下拉列表。

对你的部分:

#cityDropdownDiv
    -unless @cities.blank?
        = collection_select( :market, :city, @cities, :id, :cities)

这样,渲染部分时不需要添加:f => f参数。

您应该在html_option部分的下拉列表中添加一个ID(我假设为“stateDropdown”)。

答案 1 :(得分:1)

另外一个非常有帮助的教程,我想这将有助于任何希望实现依赖下拉列表的人http://www.petermac.com/rails-3-jquery-and-multi-select-dependencies/