2

我在 Rails 4.1.2 应用程序中有一个 API 控制器,它不是从应用程序控制器继承的。我正在尝试包含 respond_to 方法并得到一个方法未定义的错误......所以我需要在顶部的 actionpack,如下所示:

require 'action_pack'

class Api::V1::UsersController < Api::ApiController
  version 1

  doorkeeper_for :all
  respond_to :json

  def show
    respond_with current_user.as_json(except: :password_digest)
  end
end

我仍然得到

ActionController::RoutingError (undefined method `respond_to' for Api::V1::UsersController:Class):

但是 respond_to 方法是 MODULE ActionController::MimeResponds::ClassMethods 的一部分,如果我打开 actionpack gem 源代码,可以在子目录中的 action_pack 文件夹下找到它。

编辑:

我还应该提到 Api::ApiController 有一个父 RocketPants::Base 因为我正在使用 Rocketpants api gem ... gem 的作者在他的自述文件中说:“RocketPants 只包括制作 apis 的最低限度。在不久的将来,它可以被修改为与 ActionController::Base 一起使用,以便更好地与其他 gem 兼容。”

我对如何以独立的方式访问 action_pack 方法/库(如果可能的话)特别感兴趣,就像您在包含 activesupport 时可以使用的方式一样。

4

4 回答 4

5

只需让您的Api::ApiController(或其父母,如果有的话)继承自ActionController::Base


你提到你正在使用 RocketPants 的好事!快速查看他们的 github 页面确认它已经派生自ActionController::Base. 这使我以前的答案不正确。

所以看起来你不需要打电话respond_to,而不是respond_with你应该使用expose,但这是一个眨眼的猜测。您应该遵循他们的文档

于 2014-07-22T01:26:45.423 回答
5

还要检查你的 Rails 版本。在 Rails 4.2 及更高版本中,respond_to 语法已移至 响应者 gem中。

宝石文件:

gem 'responders'

安慰:

bundle install
rails g responders:install
于 2015-09-05T16:44:31.340 回答
3

ActionController::RoutingError: undefined method 'respond_to'我在使用rails-api gem时看到了这个错误。切换ActionController::APIActionController::Base我的错误后解决了。这也修复active_model_serializers了无法render :json使用我的模型的相应序列化程序自动包装的问题。我可能会将其记录为 gem 的问题。

于 2014-09-29T19:00:32.237 回答
0

您必须包括(至少) ActionController::RespondWith 模块。

于 2015-06-25T15:42:49.843 回答