同一 rails 资源的多个 devise_for 路线

Posted

技术标签:

【中文标题】同一 rails 资源的多个 devise_for 路线【英文标题】:Multiple devise_for routes for the same rails resource 【发布时间】:2015-11-19 15:18:57 【问题描述】:

我正在开发一个使用 Rails 3 和 Devise 的现有 Web 应用程序。我目前的任务是向应用程序添加 JSON API。我创建了一个 Mobile::SessionsController (

问题在于路由。目前,routes.rb的相关部分如下:

 # For the web app:
  devise_for :users, :controllers => :sessions => 'sessions',
                                      :registrations => 'registrations'
  as :user do
    get "/login" => "devise/sessions#new"
    get "/logout" => "devise/sessions#destroy", :as => :logout
    post '/signup' => 'registrations#signup', :as => :signup
  end
  # And for the API, later on:
  namespace :api do
    namespace :user do
      devise_for :users, :controllers => :sessions => 'mobile/sessions',
                 skip: :all
      devise_scope :user do
        post 'login' => 'mobile/sessions#create'
      end
...

数据端点位于 /api/user/login。 rake routes 列出了以下内容:

api_user_login POST /api/user/login(.:format) api/user/mobile/sessions#create

在我的规范中,有以下内容:

describe Mobile::SessionsController do
  render_views
  describe '#create' do
    context 'for some condition' do
      let(:params) do
        
          # basic params
        
      end
      before do
        post :create, params.merge(format: :json)
      end

      it 'should render a json response' do
        expect(response.headers['Content-Type']).to eq 'application/json; charset=utf-8'
      end
...

当我运行规范时,它给出了以下错误:

AbstractController::ActionNotFound: Could not find devise mapping for path "/mobile/sessions/create.json?params=blah.
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]

我在第二个 devise_for 块中尝试了许多不同的配置(模块,是否使用 skip: :all,完全删除第二个 devise_for,将它放在命名空间的不同级别),我无法动摇错误。我的猜测是那里的第二个选项(devise.mapping 位)不是解决方案,因为它似乎根本不应该绕过路由器。而且由于我的路线 精确 是它为第一个选项建议的那种块,所以我对如何解决这个问题感到困惑。我怎样才能让这个东西工作?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

你写了两个不正确的 devise_for。您将不需要 api devise_for,因为在 pais 中不需要它

【讨论】:

以上是关于同一 rails 资源的多个 devise_for 路线的主要内容,如果未能解决你的问题,请参考以下文章

rails动作控制器中未定义的方法“devise_for”

如何使用 Rails 3 在同一视图中创建同一类的多个对象?

在同一台服务器上托管多个 Rails 应用程序

同一张表的多个关联(多对多)Ruby on Rails

Ruby on Rails 路由解析

rails:3 设计注册过滤器链停止为 :require_no_authentication 呈现或重定向