Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将用户重定向到某个页面,将其他用户重定向到另一个页面_Ruby On Rails_Redirect_Before Filter - Fatal编程技术网

Ruby on rails 将用户重定向到某个页面,将其他用户重定向到另一个页面

Ruby on rails 将用户重定向到某个页面,将其他用户重定向到另一个页面,ruby-on-rails,redirect,before-filter,Ruby On Rails,Redirect,Before Filter,我有两种用户:工作者和管理员。 我有一张员工表和一张管理员表。 我想强制用户在进入应用程序页面之前登录。 因此,我在下一行添加了我的应用程序控制器: `before_filter :authenticate_user!` 现在,我编写了一个函数,名为:is\u worker,用于检查是否在workers表中找到了用户。如果是这样,请将他重定向到工人页面。如果找不到该用户,请将其重定向到管理页面 我希望工人将无法进入管理员页面,管理员将无法进入工人页面 因此,我认为我应该在过滤器之前添加::is

我有两种用户:工作者和管理员。 我有一张员工表和一张管理员表。 我想强制用户在进入应用程序页面之前登录。 因此,我在下一行添加了我的应用程序控制器:

`before_filter :authenticate_user!`
现在,我编写了一个函数,名为:
is\u worker
,用于检查是否在workers表中找到了用户。如果是这样,请将他重定向到工人页面。如果找不到该用户,请将其重定向到管理页面

我希望工人将无法进入管理员页面,管理员将无法进入工人页面

因此,我认为我应该在过滤器之前添加:
:is\u worker
到:
workerscontroller
adminscontroller

class ApplicationController < ActionController::Base
  protect_from_forgery

  before_filter :authenticate_user!

  def is_worker
     @email = current_user.email
     tag = Worker.where(:email => @email)
     if tag.nil?
        redirect_to '/admins'
     else
        redirect_to '/workers'
     end
  end
end
class ApplicationController@email)
如果tag.nil?
将_重定向到“/admins”
其他的
将_重定向到“/workers”
结束
结束
结束

如果我错了,请纠正我。

效率不高。假设您使用的是STI,请创建一个
is\u worker?
方法,如下所示:

def is_worker?
  current_user.type == 'Worker'
end
def redirect_after_sign_in
  if current_user.is_worker?
    redirect_to '/admins'
  else
    redirect_to '/workers'
  end
end
然后,您可以在控制器中添加如下方法:

def is_worker?
  current_user.type == 'Worker'
end
def redirect_after_sign_in
  if current_user.is_worker?
    redirect_to '/admins'
  else
    redirect_to '/workers'
  end
end
我会让它成为一种私人方法。用户成功登录后,可以调用此方法


即使这样,您也希望在控制器级别保护您的应用程序,这样工作人员就不能直接进入
/admins
URL查看管理员数据

谢谢。。然后我应该加上:before\u filter:is\u worker在ApplicationController中吗?实际上我不知道我是怎么想的。正在编辑。用户和工作人员/管理员的关系如何?您是否有一个
用户
类(表)和两个独立的
工作者
/
管理员
类/表?或者它是一个具有“类型”或“角色”的类?如果您使用Deviate,您可以执行
authenticate\u worker
authenticate\u admin
,如果它们位于单独的表中。@nathanvda,我使用的是“Deviate”。我将每个注册的用户插入workers表。我有一个管理员表(我将电子邮件添加到此表中)。我可以让一个工人成为经理(通过将他从工人表移动到管理员表)。但是,你告诉我我可以做:“authenticate_admin”,但我必须将用户定义为admin。如何将用户定义为管理员?以及如何将用户定义为工作者(以便使用:authenticate\u admin和authenticate\u worker)