只有在有rescue_from时,Rails才会路由到错误的控制器操作

时间:2014-09-09 20:40:58

标签: ruby-on-rails ruby ruby-on-rails-3.2 routing

我正在尝试向现有的Rails 3.2 Web应用程序添加一个非常简单的API(使用this指南)。我遇到的问题是我的路由正在执行现有操作而不是我的新操作,但只有当我尝试rescue_from异常时才会这样做。这是代码(显然不是我真正的代码,但保留了基本元素):

# config/routes.rb

resources :merchants, only: [:index] # existing route
# rake routes generates: goodies GET /goodies(.:format) goodies#index

# http://railscasts.com/episodes/350-rest-api-versioning
class ApiConstraints
  def initialize(options)
    @version = options[:version]
    @default = options[:default]
  end

  def matches?(req)
    req.headers['Accept'].include?("application/vnd.my_app.v#{@version}") || @default
  end
end

namespace :api, defaults: { format: 'json' } do
  scope module: :v1, constraints: ApiConstraints.new(version: 1) do
    resources :goodies, only: [:index] # new route
  end
end
# rake routes generates: api_goodies GET /api/goodies(.:format) api/v1/goodies#index {:format=>"json"}

# app/controllers/goodies_controller.rb

class GoodiesController < ApplicationController
  def index
    @goodies = Goody.order(:name)
  end
end

# app/controllers/api/v1/base_controller.rb

class Api::V1::BaseController < ActionController::Metal
  include ActionController::Rendering
  include ActionController::MimeResponds
  include AbstractController::Callbacks

  append_view_path "#{Rails.root}/app/views"

  before_filter :authenticate
  rescue_from NotAuthenticated, :deny_access # it works if I comment-out this line

  private

  def authenticate
    # fail NotAuthenticated if not authenticated
  end

  def deny_access
    render json: { error_message: 'Forbidden' }, status: 403
  end
end

# app/controllers/api/v1/goodies_controller.rb

class Api::V1::GoodiesController < Api::V1::BaseController
  def index
    @goodies = Goody.order(:name)
  end
end

当我发送GET my_app.dev/api/goodies标头值设置为Accept的{​​{1}}请求时,以下是我的方案:

  1. with application/vnd.my_app.v1
    1. 没有auth信用卡 - 我从rescue_from使用的视图而不是goodies#index
    2. 使用的视图中获得结果
    3. 使用auth creds - 同样
  2. 没有 api/v1/goodies#index
    1. 没有auth creds - 我得到标准开发Rails 500错误页面,显示出现rescue_from错误
    2. 使用auth creds - 我从NotAuthenticated
    3. 使用的视图中获得结果
  3. 对于方案#1,我知道它不只是使用错误的视图,因为如果我在api/v1/goodies#index中放置了fail,我仍会得到api/v1/goodies#index的结果。

    我不认为这是相关的,但我使用goodies#index次观看。

    我看到了this帖子,它类似于*.json.jbuilder,但具体针对rescue_from。我没有尝试过OP的评论,但我认为我不应该更改我的控制器名称才能使其发挥作用。

0 个答案:

没有答案