【问题标题】:How to include respond_to when you don't inherit from ApplicationController in Rails 4?当您不从 Rails 4 中的 ApplicationController 继承时,如何包含 respond_to?
【发布时间】:2014-09-12 15:58:10
【问题描述】:

我在 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 的作者在他的 README 中声明:“RocketPants 只包括制作 apis 的最低限度。在在不久的将来,它可能会被修改为与 ActionController::Base 一起使用,以便更好地与其他 gem 兼容。”

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

【问题讨论】:

    标签: ruby-on-rails ruby require actionpack


    【解决方案1】:

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


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

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

    【讨论】:

    • 谢谢本杰明...所以我应该提到 Api::ApiController 也有一个父 RocketPants::Base 因为我使用的是 Rocketpants api gem ...我应该制作一个“祖父母”控制器吗?让 Api::ApiController 继承自 ActionController::Base?
    • 谢谢 Benjamin,所以在这种情况下,您认为您不能使用 include 'action_pack' 并使用 respond_to? (我正在尝试看看我是否可以像将来使用 activesupport 一样以独立的方式使用 actionpack)。
    • 我认为你不需要它,这就是使用 RocketPants 的全部目的。但实际上我可能是错的,因为我从未使用过 RocketPants,从外面看就是这样。抱歉,我帮不上忙
    • 感谢本杰明,感谢您的帮助!
    【解决方案2】:

    还要检查您的 Rails 版本。在 Rails 4.2 及更高版本中,respond_to 语法已移至 responders gem.

    宝石文件:

    gem 'responders'
    

    控制台:

    bundle install
    rails g responders:install
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 您是否使用 gem 记录了这个问题?我也面临类似的错误。
      • @Inquisitive 我现在不会记录它,因为rails_api 已被纳入 Rails。 (只是把那张纸条留给后代。)
      【解决方案4】:

      你必须(至少)包含 ActionController::RespondWith 模块。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-13
        • 1970-01-01
        • 2020-04-16
        相关资源
        最近更新 更多