2

次のコードを使用して、Rails 3 で AJAX アクションをセットアップしようとしています。コードの AJAX 部分は機能しているように見えますが、正しいファイルを要求せず、respond_to は通常の HTML を提供します。

ルーティング情報:

resources :zones do
  resources :records
end

コントローラ:

def new
  @zone = Zone.new
  respond_to do |format|
    format.html
    format.js
  end
end

ビュー内のリンク (haml):

= link_to 'Add a zone →', new_zone_path, :remote=>true

link_to から生成された HTML (また、html エンティティのレンダリングが失敗していることに注意してください...しかし、それは別の問題です):

<a href="/zones/new" data-remote="true">Add a zone &amp;#8594;</a> 

キックについては、ビュー/ゾーンのディレクトリリスト。私はこれを正しく行っているかどうか確信が持てないので、new.js.rjs と new.rjs の両方を持っています。どちらも同じ内容ですが、アクションによって取り上げられることはありません。

|   `~zones/
|     |-_form.html.haml
|     |-_record.html.haml
|     |-edit.html.haml
|     |-index.html.haml
|     |-new.html.haml
|     |-new.js.rjs
|     |-new.rjs
|     `-show.html.haml

最後に、リンクをクリックしたときのサーバー ログ:

Started GET "/zones/new" for 127.0.0.1 at Wed Dec 29 00:04:03 -0700 2010
  Processing by ZonesController#new as */*
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE ("users"."id" = 1) LIMIT 1
Rendered zones/_form.html.haml (22.1ms)
Rendered zones/new.html.haml within layouts/application (34.9ms)
Completed 200 OK in 80ms (Views: 42.0ms | ActiveRecord: 0.4ms)

ご覧のとおり、リクエストの .html ファイルをレンダリングしています。ここで、テストのために、ページhttp://localhost:3000/zones/new.jsに直接アクセスします。そして、new.js.rjs を提供します。また、javascript リモート呼び出しが機能しています。Firebug はリクエストとレスポンスを表示しますが、間違ったページをリクエストしています。

また、テストのためにこれを行いました:

= link_to "Add a zone", '/zones/new.js', :remote=>true

これは、javascript に対しては正常に動作します (rjs がダウンロードされ、実行され、正しく動作します)。

それが価値があるために、私はjqueryを使用しています。

ルーティングまたはリンク構文で何かが欠けているように感じますが、オンラインおよびドキュメントで見つけることができるすべての例は、私が何をしているかを正確に示しているようです. キャッチは何ですか?

ありがとう。

4

2 に答える 2

6

この問題もこの構文で解決できます (data-type宣言を含む)

= link_to 'Add a zone &#8594;', new_zone_path, remote: true, "data-type" => "script"

.js.erbfile しかなく、レンダリングするファイルがない場合.htmlは、 of リクエストを割り当てる必要はありませんdata-type(Rails は、その JS のみの応答方法を自動的に検出します)。

ここでの要点は、リクエストが JS として実行されると見なされることを確認する必要があるということです。これは、コンソールでのリクエストが次のようになることを意味します。

Started ...
Processing by ABCController#method as JS
于 2014-07-29T13:25:14.997 に答える
6

jsフォーマットが必要であることを Rails に明示的に伝える必要があります。

= link_to 'Add a zone &#8594;', new_zone_path(:format => :js), :remote=>true

説明の方法として: Rails は区別しないため、拡張子 .js を指定する必要があります。多くの場合、javascript だけでなく、Ajax を使用して html や json を取得したい場合があります。Rails では、あらゆるコンテンツをあらゆるフォーマットで取得できるため、コンテンツを指定する必要があります。

于 2010-12-29T15:20:54.320 に答える