2

成功注册 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

我的用户模型:

脸书设置

  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

有人可以帮我设置吗?

4

1 回答 1

3

我通过添加到我的用户模型来解决它

attr_accessor `just_signed_up`

并将其设置User.find_for_facebook_oauth在我创建新用户(first_or_create块)的块的这一部分中。

编辑:更多解释

所以在Ruby(不是Rails)中有一个类方法/宏被调用attr_accessor(实际上还有attr_readerattr_writerattr_accessor是调用其他两个的简写)

如果你,在你的用户模型中写

class User
  attr_accessor :some_attribute

那么你就可以表演了

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

但是这个属性不会被保存到 DB 中,所以它可以作为 Rails 模型中一些值的临时存储。

要知道的另一件事是,在 Ruby 中只有两个“值”是错误的,它们是falsenil

使用这两个技巧,您可以创建一个新用户并在对象上临时设置此标志

u = User.create u.just_signed_up = true u.just_signed_up # => true u.reload!# 从数据库中获取记录 u.just_signed_up # => nil

并且由于 nil 为假,除了您刚刚创建的用户之外,此检查对于每个用户都将失败!

于 2013-09-03T17:03:07.233 回答