是否可以在具有约束的相同设计模型上具有不同的路径?

时间:2013-08-17 11:05:16

标签: ruby-on-rails devise routes constraints

我正在尝试为具有约束的相同设计模型/资源设置不同的路径,但第一条路径是在这种情况下应用的路径“visitor”。

constraints(ValidSubdomainFrontend) do
    devise_for :users, :path => "visitor", :path_names => { :sign_in => 'login', :sign_out => 'logout', :password => 'secret', :confirmation => 'verification', :unlock => 'unblock', :registration => 'register', :sign_up => 'cmon_let_me_in' }
end


constraints(ValidSubdomainAdmin) do
    devise_for :users do
        get 'users', :path => "admin", :to => 'site_backend#index', :as => :user_root # Rails 3
    end
    devise_for :users, :controllers  => { :registrations => 'users' }, :path => "admin", :path_names => { :sign_in => 'login', :sign_out => 'logout', :password => 'secret', :confirmation => 'verification', :unlock => 'unblock', :registration => 'register', :sign_up => 'cmon_let_me_in' }
end

对于不同约束下的Devise,是否可以为同一资源设置不同的路径?

使用的约束是:

class ValidSubdomainAdmin
  def self.matches?(request)
        request.subdomain.present? && 
        request.env['PATH_INFO'].start_with?('/admin')
  end
end

class ValidSubdomainFrontend
  def self.matches?(request)
        request.subdomain.present? && 
        !request.env['PATH_INFO'].start_with?('/admin')
  end
end

这可能与Devise完全相同,还是一个Bug?

1 个答案:

答案 0 :(得分:2)

找到解决此问题的方法!

更多关于上下文,基本上需要在前端使用/ visitor这样的用户可以登录(到成员区域)并编辑他们的个人资料和其他成员/客户端操作。但我也想要/ admin管理员/编辑/作者可以登录到(后端)管理仪表板/区域。两个区域都使用相同的Devise模型/资源(因此管理员也可以访问成员区域)。作为附注,目前我正在使用CanCan权限来阻止成员访问管理区域。

我只需要替换管理区域约束:

constraints(ValidSubdomainAdmin) do
    devise_scope :user do
      #root :to => "devise/registrations#new"
      get "admin/" => "admin#index"
      post 'admin/' => 'devise/registrations#new', :as => :new_admin_registration 
      match 'admin/', :to => 'admin#index'    
      get "admin/edit" => "devise/registrations#edit"
      match 'admin/edit', :to => 'devise/registrations#edit'   
      get "admin/login" => "devise/sessions#new", :as => :new_admin_session
      match 'admin/login', :to => 'devise/sessions#new'
      get "admin/logout" => "devise/sessions#destroy", :as => 'destroy_admin_session'
      match 'admin/logout', :to => 'devise/sessions#destroy' 
      post   "admin/password" => "devise/passwords#create"
      get    "admin/password/new" => "devise/passwords#new", :as => 'new_admin_password'
      get    "admin/password/edit" => "devise/passwords#edit" 
      put    "admin/password" => "devise/passwords#update"   
    end
end

我还更新了views / admin / users(由管理区域上的devise使用)以使用新的管理设备路径。

非常感谢José Valim