Rails & Devise Mapping Path



我在尝试转到http://app.mysite.dev/login-

Could not find devise mapping for path "/login".
This may happen for two reasons:
1) You forgot to wrap your route inside the scope block. For example:
  devise_scope :user do
    get "/some/route" => "some_devise_controller"
  end
2) You are testing a Devise controller bypassing the router.
   If so, you can explicitly tell Devise which mapping to use:
   @request.env["devise.mapping"] = Devise.mappings[:user]

现在,这里是我的routes.rb文件的相关部分:

namespace 'app', path: '', constraints: { subdomain: 'app' } do
    devise_for :users, :skip => [:registrations, :confirmations]
    devise_for :agents, :skip => :sessions
    devise_scope :users do
      get "login" => "users/sessions#new"
    end
    ...
end

并且get "login"线路生成的路由如下(来自rake routes

app_login GET    /login(.:format)     app/users/sessions#new {:subdomain=>"app"}

我不知道这是否重要,但我正在为用户>代理关系使用STI。

所以,我已经在定义设计的范围,我没有测试,所以有什么想法吗?

尝试用以下内容替换您的devise_scope。在你的命名空间"app"块中。

devise_scope :app_user do
  get "login" => "users/sessions#new"
end

它似乎是在改变它在命名空间中寻找的范围。

供您参考:https://github.com/plataformatec/devise/issues/2496

是的,应该是devise_scope :app_user而不是devise_scope :app_users

这只是一个简单的拼写错误——devise_scope :users应该是devise_scope :user,如错误消息中所述。

您似乎没有为您的:users定义自定义SessionsController,而Devise无法使用它的默认CCD_7。

我会定义你自己的自定义class App::SessionsController,然后添加它,像这样重写你的路线:

namespace 'app', path: '', constraints: { subdomain: 'app' } do
  devise_for :users, controllers: { sessions: 'sessions' }, skip: [:registrations, :confirmations]
  devise_scope :users do
    get "login" => "sessions#new"
  end
end

最新更新