我正在尝试向现有的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}}请求时,以下是我的方案:
application/vnd.my_app.v1
)
rescue_from
使用的视图而不是goodies#index
api/v1/goodies#index
)
rescue_from
错误NotAuthenticated
对于方案#1,我知道它不只是使用错误的视图,因为如果我在api/v1/goodies#index
中放置了fail
,我仍会得到api/v1/goodies#index
的结果。
我不认为这是相关的,但我使用goodies#index
次观看。
我看到了this帖子,它类似于*.json.jbuilder
,但具体针对rescue_from
。我没有尝试过OP的评论,但我认为我不应该更改我的控制器名称才能使其发挥作用。