【问题标题】:Rails: Devise after_sign_in_path for multiple resources routes to rootRails:为到 root 的多个资源路由设计 after_sign_in_path
【发布时间】:2019-02-08 13:57:29
【问题描述】:

我正在开发一个图书馆目录应用程序,该应用程序对管理员和用户进行身份验证。不知何故,我无法设置after_sign_in_path_for,因为现在登录路由到公共根目录,而不是每个命名空间的根目录。

我已经实现了一个管理员命名空间和管理员身份验证,并且一切正常。为了自定义我添加的 sign_out 路径:

# Overwriting the sign_out redirect path method
def after_sign_out_path_for(resource_or_scope)
  if resource_or_scope == :user
    collection_path
  elsif resource_or_scope == :admin
    new_admin_session_path
  else
    root_path
  end
end

我已经在本节中包含了用户范围,即使我还没有实现资源。一切正常。

现在我想在目录所在的位置添加一个用户资源和集合命名空间。由于我现在需要指定登录时重定向,因此我完成了 application_controller.rb:

# Overwriting the sign_in redirect path method
def after_sign_in_path_for(resource_or_scope)
  if resource_or_scope == :user
    collection_opac_path
  elsif resource_or_scope == :admin
    admin_root_path
  else
    root_path
  end
end

不知何故,我现在被重定向到主根目录,而不是 collection_opac_pathadmin_root_path。后者在定义 after_sign_in_path 之前正在工作。

在我的 route.rb 中,我有以下条目:

devise_for :users
devise_for :admins

namespace :collection do
  match '/',                          :to => 'opac#home'
  match '/opac',                      :to => 'opac#opac', :as => :opac
  root :to => 'opac#home'
end

namespace :admin do
  ...
  root :to => 'pages#pageadmin'
end

root :to => 'pages#manifesto'

Admin 在 admin 命名空间的所有控制器上都经过身份验证。用户通过集合命名空间中的 opac 控制器的 opac 操作进行身份验证。

rake routes 给出:

     collection    /collection(.:format)       collection/opac#home
collection_opac    /collection/opac(.:format)  collection/opac#opac
collection_root    /collection(.:format)       collection/opac#home

     admin_root    /admin(.:format)            admin/pages#pageadmin
           root    /                           pages#manifesto

我做错了什么?我怎样才能让它工作?

提前致谢!

更新

我认为指定用户登录表单放置在 collection/home 视图中并且在提交和登录时应该重定向到 collection/opac 很重要,而当尝试访问管理员的根目录时会出现管理员登录表单命名空间。

【问题讨论】:

  • 如何区分用户是用户/管理员,用户表中是否有字段可以区分用户是用户/管理员
  • 我有两个不同的表 1)用户,2)管理员。

标签: ruby-on-rails ruby-on-rails-3 devise


【解决方案1】:

我补充说:

def after_sign_in_path_for(resource)
 stored_location_for(resource) ||
  if resource.is_a?(User)
    collection_opac_path
  elsif resource.is_a?(Admin)
    admin_root_path
  else
    super
  end
end

调整devisegem/lib/devise/controllers/helpers.rb 中指定的内容,现在条件路由可以工作了。

【讨论】:

    猜你喜欢
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    相关资源
    最近更新 更多