同一rails资源的多个devise_for路由

时间:2015-08-25 19:10:51

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

我正在使用Rails 3和Devise的现有Web应用程序。我目前的任务是向应用程序添加JSON API。我创建了一个Mobile :: SessionsController(< Devise :: SessionsController)来实现' #create'只有数据响应。

问题出在路由中。现在,routes.rb的相关部分如下:

restorationIdentifier

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

 # 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 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
...

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

感谢帮助!

1 个答案:

答案 0 :(得分:0)

您编写了两个不正确的devise_for。您将不需要api devise_for,因为在Pais中无需使用

Duplicate devise_for