Ruby on rails 3 没有设备的omniauth(linkedin)-如何重定向到';新';有验证消息吗?

Ruby on rails 3 没有设备的omniauth(linkedin)-如何重定向到';新';有验证消息吗?,ruby-on-rails-3,omniauth,linkedin,Ruby On Rails 3,Omniauth,Linkedin,我希望用户能够通过其他服务(linked、facebook、google和twitter)进行连接,而无需填写其他密码 我一直在关注railscast.com上精彩的235集和236集,它们很好地解释了如何将OmniAuth与Desive gem结合使用 我没有使用使我困惑的Desive,我也没有设法让它像在视频广播中那样工作 我试着按照Ryan Bates的指示,适应我的情况。我不能按照236号视频第10分钟的指示去做,他在第10分钟覆盖了Desive的注册控制器和视图 因此,当没有用户登录并

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

我一直在关注railscast.com上精彩的235集和236集,它们很好地解释了如何将OmniAuth与Desive gem结合使用

我没有使用使我困惑的Desive,我也没有设法让它像在视频广播中那样工作

我试着按照Ryan Bates的指示,适应我的情况。我不能按照236号视频第10分钟的指示去做,他在第10分钟覆盖了Desive的注册控制器和视图

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

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

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

代码认证控制器

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
class用户“UserType”,:foreign\u key=>“type\u id”
有多个:登录名,:class\u name=>“UserLogin”
验证:电子邮件地址::电子邮件=>{:邮件=>'格式不正确!'
验证是否存在:电子邮件地址,:伪,:类型\u id
验证“电子邮件地址:”message=>“的唯一性”
验证\u唯一性\u的:pseudo,:message=>“已采取”
属性访问器:密码确认
验证密码的确认
验证:密码\非\空白,:message=>“不能使用空白密码!”
验证:已商定的\u服务条款,:presence=>true,:allow\u nil=>false
属性受保护:密码哈希、:密码盐、:活动、:激活\u令牌、:激活\u在
...
...
结束

为了解决问题1,我在Authentications controller中创建了一个新方法。我把它命名为new\u user\u apply\u omniauth

def new_user_apply_omniauth
  @user = User.new
  @user.apply_omniauth(session[:omniauth])
  @user.valid?
end
然后我复制了users新视图(NEW.html.erb)并将其复制到我的新用户应用omniauth.html.erb中

为了回答问题2,我使用了条件验证,请观看以下优秀的railscast: