Devise - 如果已登录,则自动从根网址重定向

9
一个名叫Carly的用户未注册并进入主页。她注册成功后自动重定向到主仪表板页面。现在被命名为CarlyCoolness123的用户关闭浏览器去吃晚饭了。回来后,她只记得实际主页的名称coolness.com,而不是coolness.com/index-dashboard。如果该用户已登录,则希望自动将其重定向到仪表板页面。这意味着,如果用户已登录,则无法访问主页。我该怎么做?我尝试了几种方法,但由于我认为这里的人们对此有更好的理解,所以我假设这里不需要包含我的错误。

将仪表板页面设置为根页面。如果用户未注册,则会重定向到注册页面。 - Prakash Murthy
不,那不是我想做的。我有4个页面:登录页面、注册页面、主页和仪表盘页面。用户登录后,当他再次访问主页时,会自动重定向到仪表盘页面,就像 Twitter 和 Facebook 一样。 - MFCS
@MFCS,“BUMP BUMP BUMP BUMP”是什么意思? - kingsfoil
3个回答

12

假设你已经正确地设置了Devise,并且有一个负责呈现仪表板视图的Dashboard控制器。在你的app/controllers/dashboard_controller.rb文件中执行以下操作:

class DashboardController < ApplicationController
  before_filter :authenticate_user!

...
end

然后在你的 config/routes.rb 文件中添加以下内容:

resources :dashboard

authenticated :user do
  root :to => "dashboard#index"
end

root :to => redirect("/users/sign_in")
如果你的仪表盘有一个索引视图,访问应用程序根目录时应该自动呈现它(如果用户已登录)。 如果用户未登录,则会重定向到设备默认的sign_in视图(如果您没有重新定义它)。

这似乎不起作用。这是我的完整routes.rb文件:Proxima :: Application.routes.draw do devise_for:users 资源:帖子
root:to => 'posts#index' def checker authenticated:user do resources:users root:to => 'dashboard#index' end end
- MFCS
什么是def checker?为什么在authenticated块中有'resources:users'?您是否定义了dashboard_controller及其before_filter? - peshkira
实际上它运行得很顺利,只需要做一些调整,非常感谢你!:D - MFCS
1
@MFCS 你做了哪些调整?这对我也不起作用。 - kingsfoil
1
在Rails 6中,它会抛出一个错误,说你已经定义了“root”路由。解决方案是在经过身份验证的块中用“/”替换“root”。 - nico_lrx

7
我更喜欢使用以下方法,因为在我的看法中,拥有多个根路径是违反直觉的 [即:当我尝试其他提到的方法时出现错误,所以我尝试了其他方法]。
我认为这种方式更好,并且实际上是@MFCS最初询问的内容,因为它不会将根路径有条件地指向其他位置。当已登录用户访问root_path时,而是重定向到不同的路径:
config/routes.rb:
root to: 'welcome#index'

app/controllers/welcome_controller.rb:

class WelcomeController < ApplicationController
  def index
    if user_signed_in?
      redirect_to dashboard_path
    end
  end
end

我更喜欢这种方式,因为控制面板仍会在浏览器中显示其URL(而不是根URL),尽管这可能不是其他人的首选项,并且还取决于您的用户体验偏好。
编辑:我的代码有误,参考了DashboardController而不是根资源的控制器。

这个可以工作,但是把路由的一部分移到控制器中似乎是一个不好的做法。 - greenie-beans

1

虽然这是一篇旧帖子,但我遇到了类似的问题,因为我没有使用devise而是使用bcrypt,所以这就是解决方法。我在我的应用控制器中定义了current_userauthorize

def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
  helper_method :current_user

  def authorize
    redirect_to 'home/index' unless current_user
  end

我会把所有用户都引导到他们的安全仪表盘,并在所有安全控制器上运行前过滤器,如下所示:before_filter :authorize,如果它们失败,则被引导到主页。希望这对未来的某个人有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接