0

FacebookとTwitterで複数のログインを提供するために、現在のデバイスシステムに認証コントローラーを追加しようとしています。そのために、私はこのチュートリアルに従っています: http://railscasts.com/episodes/236-omniauth-part-2

私の問題は、まだ登録していない人が、twitter に登録しようとしていることです。そのため、ユーザーと認証の両方を作成する必要があります。

私のコードは次のとおりです。

      user = User.new
      token = omni['credentials'].token
      token_secret = omni['credentials'].secret
      user.provider = omni.provider
      user.uid = omni.uid

      user.authentications.build(:provider => omni['provider'], :uid => omni['uid'], :token => token, :token_secret => token_secret)

      if user.save
        flash[:notice] = "Logged in."
        sign_in_and_redirect(:user, user)                
      else
        session["devise.user_attributes"] = user.attributes
        redirect_to new_user_registration_path
      end 

したがって、登録プロセスの最後に、新しいユーザーが作成されます。ただし、データベースには、そのユーザーに関する Twitter 認証レコードはありません。

それは user.authentications.build によるものですか?

あなたが私を助けることができれば、それは素晴らしいことです.

ありがとう。

4

4 に答える 4

3

データポイントとして:あなたが参照しているレールキャストは、そのレールキャストが参照するものとはわずかに異なる戦略を持っていた1.0より前のOmniauthを参照しています。(注:ライブサイトで参照している正確な方法を使用しています)。この場合、ビルドは「apply_omniauth」を呼び出します -

リソースを構築する登録コントローラーを (ビデオで参照されているように) 作成したことを確認してください。これが私の現在の作業例です:

    class RegistrationsController < Devise::RegistrationsController
  def create
    super
    session[:omniauth] = nil unless @user.new_record?
  end

  private

  def build_resource(*args)
    super
    if session[:omniauth]
      # apply omniauth calls the user model and applies omniauth session to the info
      @user.apply_omniauth(session[:omniauth])

      #
      @user.valid?
    end
  end
end

ただし、認証レコードを作成する必要があります。これが私の正確な呼び出しです。

current_user.authentication.create!(:provider => omniauth['provider'], :uid => omniauth['uid'])

それが役に立てば幸い。

于 2012-11-14T22:00:33.573 に答える
2

はい、それはビルドのためです

User.build # allocates a new record for you
User.create # allocates and then saves a new record for you

だから私はあなたが欲しいと思います

user.authentications.create(:provider => omni['provider'], 
                            :uid => omni['uid'], 
                            :token => token, 
                            :token_secret => token_secret)

また、作成が保存されない場合(検証の問題)を処理する必要があります

于 2012-11-14T21:58:49.057 に答える
0

Devise + Omniauthを使用している場合は、この最新のRailscastを確認できると思います。Devisegemの新しいバージョンにはOmniAuthのネイティブサポートがあります。

于 2012-11-14T21:57:33.923 に答える
0

はい、ビルドが原因です。データベースに保存せずにレコードを作成するために使用されます(新しいように)。

モデルに がある場合はUser has_many :authentications、オプションを true に設定してautosave、ユーザーを保存するときに認証を自動的に保存できます。

has_many :authentications, autosave: true

于 2012-11-14T22:27:10.017 に答える