从控制器中的两个不同变量绕过模型中的方法?

时间:2016-11-18 08:17:47

标签: ruby-on-rails ruby ruby-on-rails-5

我的控制器和模型中有这个代码

SessionsController

postgres_fdw

用户模型

def create
   user = User.from_omniauth(env["omniauth.auth"]) 
    user.skip_password_validation = true

  unless user.present?
    user = User.find_by(email: params[:session][:email].downcase)
     if user && user.authenticate(params[:session][:password])
      log_in user
      redirect_to user
      # Log the user in and redirect to the user's show page.
    else
      # Create an error message.
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new'
    end    
  else        
    log_in user
    redirect_to user
  end
end

由于我的会话控制器中有两种不同的登录方法,我需要跳过用户模型中的方法。我已经查看了一些内容,例如在过滤器之前,在操作和属性访问器之前以及搜索Web但是似乎无法找到如何跳过模型中的方法,因此我可以绕过我在会话中分配的每个用户变量的那些控制器?即,一个用于omniauth facebook,另一个用于标准登录。

1 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,那么在普通身份验证的情况下就不会设置env["omniauth.auth"],所以可以选择:

def create
  user = if env["omniauth.auth"]
    User.from_omniauth(env["omniauth.auth"]).tap do |u|
      u.skip_password_validation = true
    end
  else
    User.find_by(email: params[:session][:email].downcase).tap do |u|
      unless u && u.authenticate(params[:session][:password])
        # Create an error message.
        flash.now[:danger] = 'Invalid email/password combination'
        render 'new'
        return
      end
    end
  end

  log_in user
  redirect_to user
end