0

RubyonRailsは初めてです。私はインターネットで入手可能なMichelHartlのリファレンスドキュメントを通じてそれを学んでいます。ただし、ユーザーのサインイン中に問題が発生しました。before_saveがcreate_remember_tokenメソッドを呼び出していないのではないかと思います。私は非常に長い間この問題をデバッグしようとしています。私のコードは次のとおりです。

user.rbファイル:

# == Schema Information
#
# Table name: users
#
#  id              :integer(4)      not null, primary key
#  name            :string(255)
#  email           :string(255)
#  created_at      :datetime        not null
#  updated_at      :datetime        not null
#  password_digest :string(255)
#  username        :string(255)
#  remember_token  :string(255)
#

class User < ActiveRecord::Base
def to_param
username
end
attr_accessible :name, :email, :password, :password_confirmation, :username
has_secure_password


before_save { |user| user.email = email.downcase }
before_save :create_remember_token

private

def create_remember_token
 self.remember_token = SecureRandom.urlsafe_base64
end
end

session_helper.rb

module SessionsHelper

def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
current_user = user
end

def current_user=(user)
  @current_user = user
end

def current_user
 @current_user ||= user_from_remember_token
end

def signed_in?
 !current_user.nil?
end

private

def user_from_remember_token
  remember_token = cookies[:remember_token]
  User.find_by_remember_token(remember_token) unless remember_token.nil?
end   
end

session_controller.rb:

class SessionsController < ApplicationController
def new

end

def create
    user=User.find_by_username(params[:session][:username])
    if user && user.authenticate(params[:session][:password])
        sign_in user
        redirect_to "/@/#{params[:session][:username]}"
    else
        flash.now[:error] = "Login failed! Please try again!"
        render 'new'
    end
end

def destroy

end
end

私を助けて、問題がどこにあるかを知らせてください。乾杯 :)

4

4 に答える 4

1

before_saveコールバックは、ユーザーが作成されたとき(つまり、サインインしたときではなく、サインアップしたとき)にのみ呼び出す必要があります。コードサンプルには、サインアップ/ユーザー作成フロー全体は表示されていませんが、存在すると思います。

Railsコンソールから次のコマンドを実行することにより、create_remember_tokenが呼び出されるかどうかをテストできます(ユーザーが作成されたとき)。

User._save_callbacks.select { |cb| cb.kind.eql?(:before) }.collect(&:filter).include?(:create_remember_token)

create_remember_token関数が保存時に実行されている場合にのみ、trueが返されます。詳細については、コールバックAPIドキュメントの「コールバックのデバッグ」セクションをご覧ください。

サインアップフロー中にコールバックが呼び出された場合は、remember_tokenをDBに保存する必要があります。Railsコンソール(User.last、テストユーザーの作成後)でユーザーを検査することで、それを確認できます。

サインアップ/ユーザー作成フローはどのようになっていますか?あなたが説明している問題を引き起こす再現手順は何ですか?

于 2012-05-10T19:05:09.243 に答える
1

サインイン中に発生している問題は正確には何ですか?

私が尋ねる理由は、create_remember_tokenメソッドがサインインプロセス中に呼び出されることを想定していないためです。ユーザーが保存される(サインアップ)ときに呼び出されます。

サインインプロセスは、usersテーブルからトークンをフェッチし、それを永続的なCookieにコピーするだけです。サインインプロセスは、おおよそ次のようになります。

sign_in user-> session_helper.rb-> def sign_in(user)-> items.permanent [:remember_token] = user.remember_token-> back to session_controller.rb-> redirect_to .. ..

于 2012-05-10T20:18:13.020 に答える
0

レイアウトでcsrfメタタグを使用していない可能性があります。コントローラフォルダのapplication_controller.rbにある「偽造からの保護」を削除してみてください。次に、アプリをもう一度実行してみてください。機能する場合は、レイアウトにタグを追加していません。

于 2013-07-07T18:28:12.850 に答える
0

私は1年前にこの質問を投稿しました。現在、認証にDevisegemを使用しています。すべてが期待どおりに機能しています。

ありがとう

于 2013-07-08T05:40:04.383 に答える