私が構築している Rails 3.2.13/Ruby 2.0.0p195 アプリで、初めて使用する Devise (2.2.4) を使用しようとしています。独自の個別のユーザー ビューと管理者ビューが必要なため、scoped_views をオンにしました。そして、私は自分のUsers::RegistrationsControllerを作成しました。これは、私がやりたいことをしているようです。独自の Users::SessionsController を追加しましたが、ここで問題が発生しました。
最初のステップとして、Devise::SessionsController ソースからいくつかのアクション メソッドを直接コピーし、それらが機能するようになったら変更する予定です (私のコントローラー コードはこの投稿の最後にあります)。しかし、`sign_in_params' が明らかに未定義であるため、'new' メソッドを呼び出すと NameError で失敗します。
私は Devise::SessionsController から継承しているので、かなり奇妙に思えます。GitHub でそのソースを見ると、一番下の保護されたセクションに sign_in_params が定義されています。そこで、コントローラーが Devise::SessionsController から正しく継承されているかどうかを調査することにしました。継承されたすべてのメソッドを一覧表示できますが、その 1 つが欠けているわけではありません。そのため、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
下線付きのメソッドを無視すると、残りは Sign_in_paramsを除くDevise::SessionsController ソースで定義されたすべてのメソッドです。私が書いたものがそのメソッドをどのように削除できるのかわかりません。他に何を試すべきか考えられません。Google はこの問題について沈黙を守っているので、私は何かばかげたことをしていると思いますが、何が原因かわかりません。何か提案はありますか?また、Rails Console のコードを少し実行して、結果を確認する人もいるでしょうか?
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