2

我希望用户能够通过其他服务(链接、facebook、google 和 twitter)进行连接,而无需填写另一个密码。

我一直在关注 railscast.com 令人惊叹的 235 和 236 集,它们很好地解释了如何将 OmniAuth 与 Devise gem 一起使用。

我没有使用让我感到困惑的设计,而且我无法让它像在视频广播中那样工作。

我尝试按照 Ryan Bates 的指示并适应我的情况。我无法按照他在 no236 视频第 10 分钟的指示进行操作,他在其中覆盖了 Devise 的注册控制器和视图。

所以当没有用户登录并且没有可用的omniauth身份验证时,我的问题就会发生。在这种情况下,我需要创建一个新用户、保存、登录并最终重定向。

如果验证后保存失败,我需要重定向到带有验证错误的用户新表单。

我确实设法重定向到新的用户表单,但我没有设法得到验证错误。

CODE 认证控制器

def create
  omniauth = request.env["omniauth.auth"] 
  #current_user = find_current_user
  authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
  if authentication
    flash[:notice] = "Signed in successfully."
    login_and_redirect(authentication.user)
  elsif @current_user 
    @current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid'])
    flash[:notice] = "Authentication successful."
    redirect_to authentications_url
  else
    user = User.new
    puts "OmniAuth: " + omniauth[:info].to_s
    user.apply_omniauth(omniauth)

    if user.save
      flash[:notice] = "Signed in successfully."
      login_and_redirect(user)
    else
      flash[:notice] = "Omniauth Extra."
      session[:omniauth] = omniauth.except('extra')
      user.valid?
      #redirect_to :controller => :users, :action => :new, :plan => 2
      redirect_to new_user_url
    end
  end 
end

问题

问题 1:如何使用omniauth 用户信息和错误消息通过预先填写的表单重定向到新用户?

问题 2:在使用其他服务进行身份验证时,如何在我的非设计模型中跳过验证?

用户型号

class User < ActiveRecord::Base

  has_many :authentications
  belongs_to :type, :class_name => "UserType", :foreign_key => "type_id"
  has_many :logins, :class_name => "UserLogin"

  validates :email_address, :email => { :message => 'format is incorrect!' }

  validates_presence_of :email_address, :pseudo, :type_id
  validates_uniqueness_of :email_address, :message => "has already been taken"
  validates_uniqueness_of :pseudo, :message => "has already been taken"

  attr_accessor :password_confirmation
  validates_confirmation_of :password

  validate :password_non_blank, :message => "Cannot use blank password!"

  validates :agreed_terms_of_services, :presence => true, :allow_nil => false

  attr_protected :password_hash, :password_salt, :active, :activation_token, :activated_at

  ...

  ...
end
4

1 回答 1

1

为了解决问题 1,我在 Authentications 控制器中创建了一个新方法。我将其命名为 new_user_apply_omniauth

def new_user_apply_omniauth
  @user = User.new
  @user.apply_omniauth(session[:omniauth])
  @user.valid?
end

然后我复制了用户新视图(new.html.erb)并将其复制到我的 new_user_apply_omniauth.html.erb

要回答问题 2,我使用了条件验证,请观看这​​个出色的 railscast:http: //railscasts.com/episodes/41-conditional-validations

于 2012-11-03T16:52:01.323 回答