我正在嘗試使用我正在構建的Rails 3.2.13/Ruby 2.0.0p195應用程序使用Devise(2.2.4),這是我的新手。我關閉scoped_views是因爲我想擁有自己的用戶和管理員視圖。我創建了我自己的Users :: RegistrationsController,它似乎正在做我想做的事情。我剛剛添加了我自己的Users :: SessionsController,這是我碰到問題的地方。設計sign_in_params方法丟失
我直接從Devise :: SessionsController源中複製了幾個操作方法,作爲第一步,計劃在它們工作後修改它們(我的控制器代碼位於本文的底部)。但是當我調用'new'方法時,由於'sign_in_params'顯然未定義,所以在調用NameError時失敗。
那麼,這似乎很奇怪,因爲我從Devise :: SessionsController繼承,當我看着GitHub上的source for that時,底部受保護部分中定義了sign_in_params。所以我決定調查我的控制器是否從Devise :: SessionsController正確繼承 - 而且看起來確實如此。我可以列出所有繼承的方法,只是沒有一個遺漏的方法。所以,我最終運行下面的代碼在Rails的控制檯:
(Devise::SessionsController.new.methods - DeviseController.new.methods).each {|m| puts m}
而且它產生以下輸出:
_one_time_conditions_valid_68?
_one_time_conditions_valid_72?
_callback_before_75
_one_time_conditions_valid_76?
new
create
destroy
serialize_options
auth_options
如果我忽略了下劃線的方法,其餘的是所有這些方法來定義在設計:: SessionsController源除 sign_in_params。我看不出有什麼我寫的東西可以刪除這個方法,我想不出還有什麼可以嘗試的。 Google對這個問題保持沉默,所以我認爲我正在做一些特別愚蠢的事情,但我無法弄清楚什麼。有什麼建議嗎?還有人可能會嘗試運行那些Rails控制檯代碼來看看他們得到了什麼?
class Users::SessionsController < Devise::SessionsController
prepend_before_filter :require_no_authentication, :only => [ :new, :create ]
prepend_before_filter :allow_params_authentication!, :only => :create
prepend_before_filter { request.env["devise.skip_timeout"] = true }
# GET /resource/sign_in
def new
self.resource = resource_class.new(sign_in_params)
clean_up_passwords(resource)
respond_with(resource, serialize_options(resource))
end
# POST /resource/sign_in
def create
self.resource = warden.authenticate!(auth_options)
set_flash_message(:notice, :signed_in) if is_navigational_format?
sign_in(resource_name, resource)
respond_with resource, :location => after_sign_in_path_for(resource)
end
end
謝謝,阿爾詹。你說得很對。 Devise Wiki鏈接到GitHub上的'master'分支似乎是比當前gem更新的版本。我甚至檢查了master分支的README,它在頂部有一個徽章,上面寫着'gem version 2.2.4',但現在你已經指出我可以明確地選擇2.2的源代碼,我可以看到你'重新正確。我認爲我檢查的'gem version 2.2.4'徽章不是指它出現的分支,而是告訴你當前的發行版本是什麼。我將不得不更好地研究GitHub告訴我什麼。 – RobJ