2011-09-10 14 views
0

ここで説明するように、私はDeviseでAjaxログインをしようとしています:http://jessehowarth.com/2011/04/27/ajax-login-with-devise#comment-5(jBeasleyからのコメントを参照)。Rails 3 AJAX:間違った定数名

私のコントローラは、このエラーになり

class Users::SessionsController < Devise::SessionsController 
    def failure 
    render :json => {:success => false, :errors => ["Login failed."]} 
    end 
end 

を返すようにしようとしている:

NameError (wrong constant name ["{\"success\":false,\"errors\":[\"Login failed.\"]}"]Controller): 

とFirebugのは、[500内部サーバーエラー]を示します。

どうすればこの問題を解決できますか?私はRails 3.1を実行しており、1.4.5を考案しています。

ありがとうございます!

答えて

3

コメント#4でJeff Poultonが推奨する手順を実行しましたか? 1.4.5の:recallオプションは、古いバージョンとは完全に互換性がないようです。これでコントローラを送信する必要がありますが、チュートリアルでは、彼は単にアクションを送信するだけです(古い方法)。

あなたの場合、Devise 1.4.5では:recall => :failureに変更する必要があります。に変更する必要があります。

これは、コントローラが障害アクションのために決定される方法によるものです。古いバージョンでは、単純にパラメータから引き出されました。 1.4.5では

def recall_controller 
    "#{params[:controller]}.camelize}Controller".constantize 
end 

# called via recall_controller.action(warden_options[:recall]).call(env) 

、それはルートのスタイルのコントローラとアクションを指定する文字列を、期待し:

def recall_app(app) 
    controller, action = app.split('#') 
    controller_name = ActiveSupport::Inflector.camelize(controller) 
    controlller_klass = ActiveSupport::Inflector.constantize("#{controller_name}Controller") 
    controller_klass.action(action) 
end 

# called via recall_app(warden_options[:recall]).call(env) 

あなたのアプリケーションが実際にオプションのJSONifiedハッシュを渡しているかのようにそれが思われます'#'が欠けているrecall_appに分割されず、文字列全体が「コントローラ」に連結されて、障害コントローラのクラスを確認しようとします。

+0

私がやっていたこと:recall => failure。私はそれを "users/sessions#failure"に変更し、Firebugはレスポンスとして{"success":false、 "errors": "Login failed。"}}を取得します。素晴らしい、ありがとう! – suruen

+0

ありがとうございます。私は元のバージョンが経路が誤って指定されていてもdefの失敗を知っていたので、私はまだ混乱していました。だから私の質問は、なぜ私のバージョンではエラーが発生するのですが、正しい経路はありません。分裂についてのあなたの説明は意味をなさない - 私は自分自身のソースコードに従うことを試みるとうまくいけば、プロセスのいくつかのレールを学ぶ...もう一度ありがとう! – suruen

+1

hah私は実際のJSONがそのメソッドにそれを作り出していた理由をパズルすることを試みていて、あなたの最初のコメントに気づいたばかりです。あなたが実際にインラインで呼び出しているので、失敗メソッドが呼び出されたことを確認してください。チュートリアルに注意した場合、彼は後で呼び出すための呼び出しメソッドを参照して、 ':failure'というシンボルを渡しています。あなたはJSONを 'warden [:recall]'として保存し、最終的には 'recall_app'に直接送信して、インラインでエラーを呼びます。その奇妙な定常化がどのように起こったかを見ることができます。 – numbers1311407

-1

あなたは違いを作る

def failure 
    return render:json => {:success => false, :errors => ["Login failed."]} 
end 

ないでリターンが欠落していますか?

+0

違いはありませんが、返品はオプションです。 – suruen

関連する問題