2013-05-22 20 views
7

Rails 3.2アプリケーションのコントローラーからjavascript関数(実際にcoffeescript)を呼び出そうとしています。レールのコントローラーからJavaScript関数を呼び出す方法

私はRender and/or redirect were called multiple times in this actionエラーが発生しています。

私のコードは次のようになります。

#Model.controller 

def index 
    @models = Model.all 
    my_action if current_user.name == "Bob" #or some other general conditional 
    ...and some stuff 
    respond_to do |format| 
    format.html 
    format.js #this is needed to handle ajaxified pagination 
    end 
end 

def my_action 
    respond_to do |format| 
    format.js { render :js => "my_function();" } #this is the second time format.js has been called in this controller! 
    end 
end 


#functions.js.coffee.erb 

window.my_function = -> 
    i = xy 
    return something_amazing 

コントローラからのJS関数を呼び出すための正しい方法は何ですか?

+1

:このようにそれを修正 – MrYoshiji

+0

良い点は、その1つは転記ミスです。 –

+0

my_functionは、ウィンドウやグローバル名前空間にバインドされていないため、使用できないと思います。 http://stackoverflow.com/questions/4214731/coffeescript-global-variablesおよびhttp://stackoverflow.com/questions/9059475/how-to-generate-global-named-javascript-functions-in-coffeescript-forを参照してください。 -google-a –

答えて

12

男、あなたはブロックの引数がありませんでした。一次ミス。

def my_action 
    #respond_to do # This line should be 
    respond_to do |format| 
    format.js { render :js => "my_function();" } 
    end 
end 

そして、吉吉さんのポイントは正しいです。しかしあなたのエラーはサーバー側であり、クライアント側にはまだ達していませんでした。

jsコードが1つの関数呼び出しのみであればいいと思います。より多くのJSコードならば、それはJSのテンプレートをレンダリングする方が良いでしょう

# controller 
format.js 

# app/views/my_controller/my_action.js.erb 
my_function(); 
// and some more functions. 

更新:ダブルレンダリング問題を解決する方法

条件が満たされている場合は、あなたの#INDEXリターンを持っている必要があります、またはメソッドが実行を継続します2回以上のレンダリングを引き起こします。 (:http://js2coffee.org/とあなたのコーヒーのスクリプトを試してみてください、それは動作しません。これを確認)> ` - 私はコーヒーにあなたはmy_functionの`のような関数を宣言する必要があると思う

def index 
    @models = Model.all 
    if current_user.name == "Bob" 
    return my_action 
    else 
    # ...and some stuff 
    respond_to do |format| 
     format.html 
     format.js #this is needed to handle ajaxified pagination 
    end 
end 
+0

* faceplant *、良い点があります。私はこれをあまりにも長くプレイしてきました!問題は、レンダリングを呼び出す2つのブロック(インデックスに1つ、私のアクションに1つ)があり、これがエラーを投げているということではありません。 –

+0

ありがとう、これは多くの助けと私は解決策に近づいていると思う。しかし、私はこの 'レンダリングやリダイレクトは複数回呼び出されました'エラーを解決することができません。私は詳細を提供するために私の質問を更新しました。 –

+0

@AndyHarveyのアイデアを気に入って、更新情報をチェックしてください。 –

関連する問題