仅在root_path上登录后才重定向用户

Ped*_*nto 10 ruby ruby-on-rails devise ruby-on-rails-3.1

我有一个root_path不受用户保护的Rails应用程序,即它是一个简单的门户主页,带有登录表单.

用户登录后,我希望它能够访问dashboard_path.

我这样做了:

def signed_in_root_path(scope_or_resource)
  dashboard_path
end
Run Code Online (Sandbox Code Playgroud)

这显然应该在用户root_path登录时使用,并且我不希望它进入,同时仍然保持用户返回到前一页,如果它试图击中受限区域并且它要么超时要么没有记录在.

即:

restricted_pa​​ge - > login - > restricted_pa​​ge_but_logged_in

我不想改变这种行为,这就是我没有使用过的原因after_sign_in_path,但是如果它打开了,或者想要重定向它root_path,或者任何不需要用户身份验证的路由.

我的问题是这不起作用.登录后,我将被重定向回来root_path,我相信这是因为after_sign_in_path之前被触发了.

有没有办法做到这一点?谢谢!

编辑:这是我第二次登录时工作,即我去root_path,登录,获取闪存消息,说明我已登录,并在表单上再次输入用户名和密码root_path.我成功地被重定向到了dashboard_path.不过,不是我想要的行为.

Nav*_*eed 22

只是一个想法

您可以为登录的URL定义两个根URL,这将指向仪表板,第二个用于非签名用户,这将指向登录页面

根据routes.rb中的一些约束定义不同的根URL

登录用户的根URL

constraints(AuthenticatedUser) do 
  root :to => "dashboard"
end
Run Code Online (Sandbox Code Playgroud)

非签名用户的根URL

root :to=>"users/signin"
Run Code Online (Sandbox Code Playgroud)

然后在lib/authenticated_user.rb中创建类AuthenticatedUser

class AuthenticatedUser
  def self.matches?(request)
    user_signed_in?
  end
end
Run Code Online (Sandbox Code Playgroud)

现在,如果用户登录root_url将指向仪表板,否则它将指向登录页面

你也可以创建两个根(尚未测试)

root :to => "dashboard", :constraints => {user_signed_in?}
root :to => "users/signin"
Run Code Online (Sandbox Code Playgroud)

更多关于约束 http://edgeguides.rubyonrails.org/routing.html#request-based-constraints

注意

url的优先级基于创建顺序,首先创建 - >最高优先级资源