3

.erbビューで次のフォームを検討してください。

<%= form_tag(harvester_next_url, :method => "post", :remote => true, "data-type" => :json, :id => "answerForm") do %>
<div id="dynamicFormContent"></div>
<% end %>

next特定の状況では、メソッドで JSコールバックを発行したいrender :js => "window.location = '#{definitions_path}'"

ただし、これはブラウザでは実行されません。応答の本文には「window.location...」があり、content-typeはに設定されています。text/javascriptリクエストのaccepttext/javascriptです。

Railsのバージョンは3.2.8です。

いくつかの追加情報:JSコールバックコードはコントローラーからの可能な応答の1つにすぎないため、フォームアクションをJS形式を使用するように切り替えたくありません。また、処理するためにそこからJSONが必要です。

質問:クライアント側のリダイレクト(つまり、JSON応答からwindow.locationを取得する)などを使用せずに動作させる可能性はありますか?AFAIK、これは非リモートフォームで問題なく機能します。

ADDXHRstatus = "parsererror"が完了すると終了します。明らかに、これは、jQueryが応答をJSONとして解析しようとするためtext/javascriptです。質問はまだ開いています。

4

3 に答える 3

1

コールバックをリッスンし、クライアント側でリダイレクトを実行します。

$('#answerForm').on('ajax:success', function(data) {
  if (data.url) {
    window.location = data.url;
  } else {
    // do something else...
  }
})

# -- controller code
render json: {url: definitions_path}
于 2012-11-23T09:54:18.697 に答える
1

最後に、私はそれを機能させました。ただし、着信JSをそのまま実行するのは一般的に汚いアプローチであることに気づきました(皆さんはそう言っています)。しかし、私の質問がその汚いアプローチに関するものである限り、本当に必要な場合にそれを機能させる方法のアイデアを投稿します。

parsererrorプレーンJSを提供する場合のステータスがあるとすると、次のことができます。

$('#answerForm').on('ajax:error',
  function(e, data, status, xhr)
  {
    $.globalEval(data.responseText);
  }
);

みんな、ありがとう!

于 2012-11-23T11:33:55.763 に答える
0

jsonを要求しても、すぐにはjavascriptとしてレンダリングされません。つまり、キーなどのjson応答からURLを取得する必要があり'next-url'ます。あなたはajaxコールバックでそれを行うことができます。

これがあなたがやろうとしていることを簡単にするはずのいくつかの読み物です:

Rails ujsチュートリアル(コールバック付き): http: //www.alfajango.com/blog/rails-3-remote-links-and-forms/

json RESTfullyに応答する方法:Rails 3:RailsでJSONを使用してRESTフルアクションに応答する適切な方法は何ですか?

xhrを検出するためにも:RailsはリクエストがAJAXであったかどうかを検出します

于 2012-11-22T16:08:44.250 に答える