Rails:将after_sign_in_path设计为用于将多个资源路由到root的

时间:2019-02-08 13:57:30

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

我正在使用图书馆目录应用程序,该程序对管理员和用户进行身份验证。我无法设置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

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

现在,我想添加放置目录的用户资源和集合名称空间。由于我现在需要指定sign_in重定向,因此我完成了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

我在做什么错?我该如何使用它?

提前谢谢!

更新

我认为重要的是要指定将用户登录表单放置在集合/主视图中,并且在提交和登录时应重定向到集合/ opac,而在尝试访问admin根目录时会出现admin登录表单命名空间。

1 个答案:

答案 0 :(得分:0)

我添加了:

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中指定的内容,现在条件路由起作用了。