0

ユーザーにサインインを強制しようdeviseとしています。サインインした後、彼のメールがワーカーのテーブルにあるかどうかを確認したいと思います。存在する場合は、彼を にリダイレクトし、そうでない場合は にリダイレクトし/workersます/tasksadmins

私は試した:

class ApplicationController < ActionController::Base
  protect_from_forgery

  before_filter :authenticate_user!
  before_filter :is_worker

  def is_worker

     @email = current_user.email
     tag = Worker.where(:email => @email)
     if tag.nil?
        redirect_to '/tasksadmins'
     else
        redirect_to '/workers'
     end
  end
end

しかし、私は得ました:

undefined method `email' for nil:NilClass

アップデート

私は試した:

class ApplicationController < ActionController::Base
  protect_from_forgery

  before_filter :authenticate_user!
  before_filter :is_worker

  def is_worker
    if user_signed_in?
       @email = current_user.try(:email)
      if @email && Worker.find_by_email(@email).nil?
        redirect_to '/tasksadmins'
      else
        redirect_to '/workers'
      end
    else
        redirect_to '/users/sign_in' # devise?
    end
  end
end
4

3 に答える 3

1

わかりました、申し訳ありません...あなたが質問を更新したことに気づきました

#SessionsController

def after_sign_in_path_for(resource)
  return request.env['omniauth.origin'] || session[:user_return_to] || root_path
end


#Your controller

before_filter :user_return_to
before_filter :authenticate_user!
before_filter :is_worker

def is_worker
   @email = current_user.try(:email)
   if @email && Worker.find_by_email(@email).nil?
      redirect_to '/tasksadmins'
   else
      redirect_to '/workers'
   end
end

private

def user_return_to
  session[:user_return_to] = request.fullpath
end

.find_by_emailのような動的ファインダーは、単一のオブジェクト (最初に一致したもの) またはnilを返します。

ただし、.where()は常に AR::Relation を返します。これは、空白* (空*) であり、決して nilではありません。

* AR::Relation は .blank? に応答します。と .empty? これらのメソッドを、実際には配列であるコレクションに委譲します。だからコード:

tag = Worker.where(:email => @email)
if tag.nil?

常にfalseを返します

于 2012-12-29T18:55:44.907 に答える
1
 def is_worker
     render :template => '/login' and return if current_user.nil?
     @email = current_user.email
     tag = Worker.where(:email => @email)
     if tag.nil?
        redirect_to '/tasksadmins'
     else
        redirect_to '/workers'
     end
  end
于 2012-12-29T18:59:08.337 に答える
1

ユーザーが正常に認証されない場合、cuurent_user は nil になります。認証にデバイスを使用していると仮定して正しいですか?

于 2012-12-29T18:44:14.157 に答える