0

私は何が間違っているのか理解できません。私はいくつかの選択リストを持っています:

  • 地域
  • 組織

どのように動作するか:

  1. ユーザーが地域を選択します。
  2. 町のロードのリスト。
  3. ユーザーはを選択します。
  4. 組織ロードのリスト。
  5. ユーザーが組織を選択します。

そのためにajaxを使用していますが、町のリストの自動ロードのみを実現し、組織に対して同じことを行うことはできません。2番目の選択リストはまったく投稿されません!

これが私のコードです:

意見

%div
  %br/
  = select 'ajax', :region_id, [['Choose your region...', -1]] + Region.all.map{|region| [region.name, region.id]}.sort
  = image_tag('ajax-loader.gif', :id => 'ajax-progress', :style => 'display: none;')
  = observe_field :ajax_region_id, :url => { :controller => :organizations, :action => :list_towns, :preselect => (defined?(preselect) && !preselect.nil?) }, :with => 'region_id', :update => 'select_organization_idd', :loading => '$("ajax-progress").show();', :complete => 'if (Ajax.activeRequestCount == 1) $("ajax-progress").hide();'
  %br/
  = select 'ajax2', :o_id, [], {}, {:id => 'select_organization_idd', :style => 'width: 60em;'}
  = image_tag('ajax-loader.gif', :id => 'ajax-progress', :style => 'display: none;')
  = observe_field :ajax_region2_id, :url => { :controller => :organizations, :action => :list_region, :preselect => (defined?(preselect) && !preselect.nil?) }, :with => 'o_id', :update => 'select_organization_idd2', :loading => '$("ajax-progress").show();', :complete => 'if (Ajax.activeRequestCount == 1) $("ajax-progress").hide();'

  = f.select :organization_id, [], {}, {:id => 'select_organization_idd2', :style => 'width: 60em;'}

コントローラ

  def list_region
    render :text => ActionController::Base.helpers.options_for_select((params[:preselect] ? [['Choose organization', -1]] : []) + Organization.map{|org| [ActionController::Base.helpers.truncate(org.name, :length => 155), org.id]})
  end

  def list_towns
    region = Region.find(params[:region_id])
    towns = Kladr.find(:all, :conditions => ['code LIKE ?', "#{region.code}%"])
    render :text => ActionController::Base.helpers.options_for_select([['Choose town', -1]] + towns.map{ |t| ["#{t.socr}. #{t.name}", t.id] })
  end

私は何を間違っていますか?また、私はRails 2を使用しているため、observe_field廃止されていません。

4

1 に答える 1

1

Rails3を使っていますか?このメソッドobserve_fieldは非推奨です。

Rails 3 では、次のようにする必要があります。

見る

%div
  %br/
  = select 'ajax', :region_id, [['Choose your region...', -1]] + Region.all.map{|region| [region.name, region.id]}.sort, {}, {:id => 'ajax1'}
  = image_tag('ajax-loader.gif', :id => 'ajax-progress', :style => 'display: none;')
  %br/
  = select 'ajax2', :o_id, [], {}, {:id => 'select_organization_idd', :style => 'width: 60em;'}, {}, {:id => 'ajax2'}
  = image_tag('ajax-loader.gif', :id => 'ajax-progress', :style => 'display: none;')

  = f.select :organization_id, [], {}, {:id => 'select_organization_idd2', :style => 'width: 60em;'}

javascript.js.コーヒー

$('#ajax1').change = () ->
  $.post(
    url: '/organizations/list_towns'
    data: {value: $('#ajax1').val()}
    success: () ->
      if (Ajax.activeRequestCount == 1) 
        $("ajax-progress").hide()
  )

$('#ajax2').change = () ->
  $.post(
    url: '/organizations/list_regions'
    data: {value: $('#ajax2').val()}
    success: () ->
      if (Ajax.activeRequestCount == 1) 
        $("ajax-progress").hide()
  )

実装はおそらく間違っており、リファクタリングされる可能性があります。私はそれをテストしませんでした。しかし、あなたはアイデアを持っています。

于 2012-08-03T14:29:22.923 に答える