Перенаправление на страницу после регистрации в Facebook

Я пытаюсь перенаправить пользователя после успешной регистрации в Facebook (не вход в систему).

Я хочу перенаправить на /getstarted/welcome после того, как пользователь регистрируется в первый раз.

Мой обратный вызов omniauth:

def facebook
        # You need to implement the method below in your model (e.g. app/models/user.rb)
        @user ||=
            User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)

        if @user.persisted?
            # This will throw if @user is not activated
            sign_in_and_redirect @user, event: :authentication
            if is_navigational_format?
                set_flash_message(:notice, :success, kind: "Facebook")
            end
        else
            session["devise.facebook_data"] = request.env["omniauth.auth"]
            redirect_to new_user_registration_url
        end
    end

Для разработки я использую

def after_sign_up_path_for(source)
  '/getstarted/welcome'
end

Моя модель пользователя:

Настройки Facebook

  def self.find_for_facebook_oauth(auth, signed_in_resource = nil)
    user = User.where(provider: auth.provider, uid: auth.uid).first
    if user.present?
        user
    else
        user = User.create(first_name:auth.extra.raw_info.first_name,
                                             last_name:auth.extra.raw_info.last_name,
                                             facebook_link:auth.extra.raw_info.link,
                                             user_name:auth.extra.raw_info.name,
                                             provider:auth.provider,
                                             uid:auth.uid,
                                             email:auth.info.email,
                                             password:Devise.friendly_token[0,20])
    end
end

Может кто-нибудь помочь мне настроить это?

1 ответ

Решение

Я решил это, добавив к моей модели пользователя

attr_accessor `just_signed_up`

и установить его в User.find_for_facebook_oauth в этой части блока, где я создаю нового пользователя (first_or_create блок).

РЕДАКТИРОВАТЬ: больше объяснений

Так что в Ruby (не в Rails) есть метод / макрос класса attr_accessor (на самом деле есть также attr_reader а также attr_writer, attr_accessor это сокращение для вызова двух других)

Если вы, в вашей пользовательской модели напишите

class User
  attr_accessor :some_attribute

тогда вы сможете выполнить

u = User.first
u.some_attribute = 'asdf'
u.some_attribute # => 'asdf'

но этот атрибут не будет сохранен в БД, поэтому он может использоваться как временное хранилище некоторого значения в модели Rails.

Еще одна вещь, которую нужно знать, это то, что в Ruby есть только два "значения", которые являются ложными. false а также nil,

Используя эти два трюка, вы можете создать нового пользователя и временно установить этот флаг на объекте.

u = User.create u.just_signed_up = true u.just_signed_up # => true u.reload! # выбирает запись из БД u.just_signed_up # => nil

и поскольку nil имеет значение false, эта проверка завершится неудачей для каждого пользователя, кроме тех, кого вы только что создали!

Другие вопросы по тегам