2017-02-10 18 views
0

私はフォームを持っています。レコードが正常に更新されたら、特定のページにリダイレクトするだけです。レコードが失敗すると、ページ上の要素を更新するjavascriptで応答したい。UJS成功した場合はhtml、失敗した場合はjsに応答してください。

現在、私のフォームはremote: trueを使用していません。したがって

<%= form_for @my_model do |f| %> 
    ... 
    <%= f.submit %> 
<% end %> 

、CONTENT_TYPEヘッダContent-Type:application/x-www-form-urlencoded、換言すれば、HTMLのJavaScriptないで応答することが期待されます。

def update 
    respond_to do |format| 
     if @my_model.update(my_model_params) 
     format.html do 
      redirect_to @my_model 
     end 
     else 
     format.js 
     end 
    end 
    end 

保存が成功すると、正しくリダイレ​​クトされます。保存による検証エラーに失敗したときしかし、むしろ、JSへの対応よりも、私は例外を取得:

ActionController::UnknownFormat 

は、どのように私はレールがJSの形式を認識してもらうことができますか?

私はフォームにremote: trueを追加し、私は、成功のためformat.js

format.js do 
     redirect_from_document_type 
    end 

format.htmlを交換する場合、それはJSに応えんが、何のリダイレクトは起こりません。代わりに、私は、ブラウザのレスポンスヘッダに以下を参照してください。

Turbolinks.clearCache() 
Turbolinks.visit("http://localhost:3000/court_records?global_filter_id=12", {"action":"replace"}) 
+0

リモートUJS呼び出しを行う場合は、 'form_for'メソッドに' remote:true'オプションを渡します。しかし、成功したアップデートでJSレスポンスを送る必要があります。 –

+0

@Arun Kumar私は成功のJSを送信したくないです。私はちょうど私の質問に示されているようにリダイレクトしたい。 – Donato

+0

私はあなたが誤解したと思います。エラーを解決するには、 'remote:true'オプションが必要です。しかし、それを追加すると、要求はオブジェクトが更新されているかどうかにかかわらずJS応答を期待します。それは理にかなっていますか? –

答えて

0

私はそれがように働いてしまった:

1)バックのform_forの呼び出しにremote: trueを追加しました:)

<%= form_for @my_model remote: true, html: { class: 'form' } do |f| %> 
    <%= render 'form', f: f %> 
<% end %> 

2次に、js応答で成功と失敗の両方を処理しました。

def update 
    respond_to do |format| 
     if @my_model.update(my_model_params) 
     @url = redirect_from_document_type 
     format.js 
     else 
     initialize_fields 
     format.js 
     end 
    end 
    end 

3)その後、リダイレクトupdate.js.erbで成功した場合はエラーを返します。

<% unless @errors %> 
    window.location = "<%= @url %>"; 
<% else %> 
    $('.form_holder').empty(); 
    $('.form_holder').append('<%= escape_javascript render("my_model/edit_form") %>'); 
<% end %> 
関連する問題