2014-07-22 71 views
2

我有一個Rails 4.1.2應用程序中的API控制器不能從應用程序控制器繼承。我想包括的respond_to方法,並得到一個方法未定義的錯誤....於是我要求ActionPack的在像下面的頂部:如何在不從Rails 4中的ApplicationController繼承時包含respond_to?

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文件夾下找到它。

編輯:

我還要提到阿比:: ApiController有父RocketPants :: Base的,因爲我使用的是rocketpants API寶石......創業板的作者說他的自述:「RocketPants只包括在不久的將來,它可能會被修改爲與ActionController :: Base一起工作,以便與其他寶石更好地兼容。「

我特別感興趣的是如何以獨立的方式訪問action_pack方法/庫(如果可能的話),包括activesupport的方式。

回答

4

只要讓你的Api::ApiController(或其母公司如果有)從ActionController::Base

繼承

你提到你正在使用RocketPants好東西!快速瀏覽他們的github頁面,確認它已經從ActionController::Base派生出來。這使我以前的答案不正確。

所以看起來你不需要撥打respond_to而不是respond_with你應該使用expose,但它是一個眨眼的猜測。你應該按照他們的文檔

+0

感謝本傑明......所以,我因爲我使用的是rocketpants API應該提阿比:: ApiController也有家長RocketPants ::基地寶石...我應該做一個「祖父母」控制器,並有Api :: ApiController從ActionController :: Base繼承? – Nona

+0

請看我的編輯 – Benj

+0

謝謝Benjamin,所以在這種情況下,你不認爲你可以使用include'action_pack'並使用respond_to? (我試圖看看是否可以以獨立方式使用actionpack,就像你可以使用activesupport的方式一樣)。 – Nona

2

我看到這個錯誤ActionController::RoutingError: undefined method 'respond_to'當我使用rails-api gem。將ActionController::API切換爲ActionController::Base後,我的錯誤得到解決。這也修復了active_model_serializers未能自動將render :json與對應的序列化程序包裝到我的模型中。我可能會將此記錄爲寶石的問題。

+0

你是否用這個寶石登錄過這個問題?我也面臨類似的錯誤。 – inquisitive

+0

@Inquisitive此時我不會記錄它,因爲'rails_api'已經滾動到Rails中。 (留下這張照片留給後人吧。) –

0

您必須包含(至少)ActionController :: RespondWith模塊。

5

另請檢查您的導軌版本。在Rails 4.2及更高版本中,respond_to語法已被移入 responders gem

的Gemfile:

gem 'responders' 

控制檯:

bundle install 
rails g responders:install