0

ユーザーが国を選択すると、状態メニューが更新されるように、動的メニューを作成しようとしています。

開発ログを見ていると、アクションが db クエリを実行してから json.erb ファイルをレンダリングしていることがわかりますが、ブラウザから応答が得られません。

ここに私が持っているものがあります:

コントローラー/settings_controller.rb

respond_to :html, :json

  def getstates
    @states = Country.find_by_iso(params[:account][:addresses_attributes]["0"][:country]).states
    respond_with(@states)
  end

(注: フォームはネストされたフォームであるため、params ハッシュが非常に長くなります。)


settings/edit.html.erb

<%= address.collection_select :country, Country.order(:name), :iso, :name, {:include_blank => true}, "data-remote" => true, "data-url" => "/settings/getstates", "data-type" => :json  %>

<%= address.select :state, [], {:include_blank => true}, :disable => true %>

設定/getstates.json.erb

$(document).ready(function() {

    $("#account_addresses_attributes_0_country").bind('ajax:success', function(evt, data, status, xhr){
      var select = $('#account_addresses_attributes_0_state');

      if (data !== null) {
        select.removeAttr('disabled');
        $.each(data, function(key, value) {
          $("<option/>").val(value[1]).text(value[0]).appendTo(select);
        });
      } else {
        select.empty();
        select.attr('disabled', 'disabled');
      }
    });
});

(注: このコードはhttp://blog.madebydna.com/all/code/2011/12/05/ajax-in-rails-3.htmlから取得しました)


開発ログ

Processing by SettingsController#getstates as JSON
  Parameters: {"account"=>{"addresses_attributes"=>{"0"=>{"country"=>"UY"}}}}
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", "1"]]
  Country Load (0.2ms)  SELECT "countries".* FROM "countries" WHERE "countries"."iso" = 'UY' LIMIT 1
  Rendered settings/getstates.json.erb (0.3ms)
Completed 200 OK in 3ms (Views: 1.5ms | ActiveRecord: 0.3ms)

これは、開発ログに表示される出力です。しかし、ブラウザには何もありません。アラートとコンソール ログ メソッドを追加しようとしましたが、何もありません。

誰かが私が間違っていることを理解するのを手伝ってくれたら本当にありがたいです。

4

2 に答える 2

1

Firebug のコンソール タブを使用すると、ajax リクエストが行われていることがわかります。次に、それを開いて、応答本文を確認できます。ライアンが提案したように、JSON を要求しているが、完全な JavaScript を返しています。したがって、そのようにしておく場合は、コールバック関数で応答を評価する必要があります。つまり、eval(data) または jQuery には、「スクリプト」タイプを要求できるショートカットもあります。しかし、RJS が Rails から削除された今、ちょっと眉をひそめています。代わりに、Dan が提案したように、settings/getstates.json.erb の内容を編集ビューに移動し、getstates.json.erb ファイルを削除します。この作業を支援するために、今のところリクエスト/レスポンスを単純化してください。これを実行して、Firebug で調べて、何が起こっているかを確認してください。その後、それをフックして、応答の内容をオプション タグに変換します。

$.get("/settings/getstates", function(data){
  console.log(data);
}, 'json')
于 2012-04-17T07:00:57.120 に答える
1

まず、あなたの .json.erb ビューについて少し混乱しています。REST リクエストが JSON を要求しているときに、(ブラウザで実行するために) Javascript を返しているようです。

次に、お気に入りのFirebugに似たツール (Chrome の Developer Tools や Safari など) を調べます。サーバーに対して行っている AJAX 要求から返されるものを見てください。(そうではない可能性があります)あなたが期待するもの - エラーコード、またはあなたが期待しているものとは異なるものを取得していますcollection_select)。

私の推測では、あなたの .json ビューは実際の Javascript を吐き出し、(何か) JSON として解析しようとして失敗し、どこかで Javascript エラー メッセージを表示します (Javascript を中止します)。繰り返しになりますが、それらの 1 つを追跡する最も簡単な方法は、Firebug に似たものを使用することです。

于 2012-04-16T21:38:37.700 に答える