2011-09-10 57 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): 

和螢火蟲表示[500內部服務器錯誤。

我該如何解決這個問題?我正在運行Rails 3.1並設計1.4.5。

謝謝!

回答

3

您是否按照Jeff Poulton在評論#4中推薦的步驟操作? 1.4.5中的:recall選項看起來與舊版本完全不兼容。它現在需要你發送控制器,而在你正在學習的教程中,他只是發送動作(舊的方式)。

在你的情況下,:recall => :failure必須改爲設計1.4.5中的:recall => "users/sessions#failure"

這是因爲確定故障操作的控制器的方式。在較舊的版本中,它只是從參數中拉出來的。

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

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

在1.4.5,它需要一個字符串指定控制器和行動,在路線的風格:

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

我在做:召回=>失敗。我將它改爲「users/sessions#failure」,現在Firebug獲得{「success」:false,「errors」:[「Login failed。」]}作爲迴應。太好了,非常感謝! – suruen

+0

謝謝你的擴展解釋。我仍然感到困惑,因爲我知道我的原始版本*即使在路由錯誤指定的情況下也會調用def failure。所以我的問題是'爲什麼我的版本會導致錯誤,而正確的路由不會,因爲無論如何都會調用def def failure?'。你對拆分的解釋是有道理的 - 我會嘗試自己關注源代碼,並希望在過程中學習一些軌道......再次感謝! – suruen

+1

呵呵我只是想看看這個試圖解釋爲什麼實際的JSON將它變成方法,並且注意到你的第一條評論。確定失敗方法被調用,因爲你實際上稱它爲內聯。如果您注意到教程,他會傳遞符號':failure',指的是稍後調用的召回方法。你的內聯調用失敗,將JSON存儲爲'warden [:recall]'並最終直接發送給'recall_app'。所以你可以看到奇怪的常量化調用是如何發生的。 – numbers1311407

-1

你缺少在

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

這是否有所作爲的回報?

+0

沒有區別,返回是可選的。 – suruen