2

私が構築している 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
4

1 に答える 1

0

Rails 3アプリケーションでRails 4と互換性のあるデバイスバージョンのコードを使用していると思います。

sign_in_params強力なパラメータで使用するメソッドです。Rails 4 で使用される gem。

デバイスバージョン2.2でコントローラーを確認した場合。https://github.com/plataformatec/devise/blob/v2.2/app/controllers/devise/sessions_controller.rb

メソッドがないことがわかりますsign_in_params

使用しているデバイスのバージョンを確認し、github の最新のコードではなく、そのデバイスのバージョンに基づいてコードをコントローラーにコピーします。

于 2013-07-08T21:39:25.503 に答える