2015-11-06 118 views
5

我有一个现有导轨4应用程序,它采用设计Omniauth。我试图修改我现有的应用程序,以开发一个API(我的意思是我的网络应用程序将保持原样,同时我也希望为移动应用程序提供API),但我的运气很不好。轨道4 + +设计的Rails API:未定义的方法 '闪速'

我下面一节中列出Rails-API下“对于已经存在的应用程序”中的步骤,现在我得到下面的错误

undefined method `flash' for #<Devise::SessionsController:0x000000098221d0> 

的错误views/devise/sessions/new.html.erb

在该行 <% unless flash.blank? %>弹出

我试过把config.middleware.use ActionDispatch::Flash放在/config/application.rb,但是错误存在

我也/config/application.rb

下面有config.api_only = false是我的代码

#app/controllers/application_controller.rb 
class ApplicationController < ActionController::API 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    include ActionController::RequestForgeryProtection 
    include Pundit 
    include ActionController::Serialization 
    include ActionView::Layouts 
    include ActionController::ImplicitRender 
    protect_from_forgery with: :null_session 

    ----some other code------ 
end 

-------- XXXXXX -----------

#/config/application.rb 
require File.expand_path('../boot', __FILE__) 

require 'rails/all' 

# Require the gems listed in Gemfile, including any gems 
# you've limited to :test, :development, or :production. 
Bundler.require(*Rails.groups, :default, :assets, Rails.env) 



module SampleApp 
    class Application < Rails::Application 
    # Settings in config/environments/* take precedence over those specified here. 
    # Application configuration should go into files in config/initializers 
    # -- all .rb files in that directory are automatically loaded. 

    # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. 
    # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. 
    # config.time_zone = 'Central Time (US & Canada)' 

    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. 
    # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] 
    # config.i18n.default_locale = :de 

    # For Custom Error Handling 
    config.exceptions_app = self.routes 

    config.middleware.use ActionDispatch::Flash 

    # To use rails default middleware for api 
    config.api_only = false 

    config.generators do |g| 
     g.test_framework :rspec, 
      :fixtures => true, 
      :view_spec => false, 
      :helper_specs => false, 
      :routing_specs => false, 
      :controller_specs => true, 
      :request_specs => true 
     g.fixture_replacement :factory_girl, :dir => "spec/factories" 
    end 
    end 
end 

------- ------- XXXXXXX

#routes.rb 
Rails.application.routes.draw do 

    devise_for :admin_users, ActiveAdmin::Devise.config 
    ActiveAdmin.routes(self) 
    # TODO add staging/dev password lock to site 
    # if Rails.env.staging? 
    # mount Lockup::Engine, at: '/lockup' 
    # end 

    # TODO come back and fix so admin user (active admin) and regular user can be logged in at same time 
    get '/', to: 'users#index', constraints: lambda { |request| request.env['warden'].user && request.env['warden'].user.role == 'admin' } 
    #root to: 'visitors#index' 

    devise_for :users, :controllers => { :registrations => "registrations", :omniauth_callbacks => "users/omniauth_callbacks" } 

    devise_scope :user do 
    root to: "devise/sessions#new" 
    end 

    namespace :api do 
    namespace :v1 do 
     devise_for :users 
    end 
    end 
    #some other unnecessary routes 
end 

问:

Rails-API说这

如果你想使用Rails的默认中间件堆栈(避免 减少是Rails的API一样),你可以添加config.api_only = false到config/application.rb文件。

因为我已经包含config.api_only = falseconfig/application.rb,并在考虑到ActionDispatch::Flash附带Rails的默认,为什么我收到错误?我需要摆脱那些?

+0

你已经尝试此suggestiion? http://stackoverflow.com/a/21149689/981183 –

+0

@KMRakibulIslam我只是试了一下,结果是一样的错误。 – Pavan

回答

10

在我把它煮到这些步骤之前,我尝试了很多建议。它为我工作。希望这可以帮助。

添加以下行config/routes.rb

devise_for :users, defaults: { format: :json } 

添加以下行config/initializers/devise.rb

config.navigational_formats = [:json] 

添加以下行config/application.rb

config.api_only = true 
config.middleware.use ActionDispatch::Flash 
+4

其实,它是固定的我没有'config.middleware.use ActionDispatch :: Flash' –

+1

但必须彻底删除导航格式: config.navigational_formats = [] –

+2

我需要所有这些东西。我一直对我的头撞了三个小时。我希望我能给你买一盒巧克力。 xoxoxo – nilatti

-4

如果你尝试回答上面,仍然得到相同的错误,请尝试fol降脂。

  1. 重新启动轨服务器

如果错误仍然存​​在:

  • application.rb文件更改刚才添加到假行config.api_only = true

    config.api_only = false 
    
  • +0

    关闭'api_only'可能会解决错误,但完全无视原始帖子的目的,即创建仅api应用。 – Micah

    0

    设计只会尝试设置Flash,如果它认为你期待你的答案在HTML中。

    我怀疑 - 唯一的问题是 - 当你调用API你没有在下列头传:

    "Accept": "application/json" 
    
    相关问题