Неопределенный метод экземпляра response_to в API-контроллере Rails 5

В рельсах 5, созданных с помощью --api, у меня есть ошибка

NoMethodError (undefined method `respond_to' for #<Api::MyController:0x005645c81f0798>
Did you mean?  respond_to?):

Однако в документации для rails 4.2 указано http://edgeguides.rubyonrails.org/4

NoMethodError (undefined method `respond_to' for #<Api::MyController:0x005645c81f0798>
Did you mean?  respond_to?):
release_notes.html.

response_with и соответствующий response_to уровня класса были перемещены в гем респондентов. Добавьте gem 'responders', '~> 2.0' в свой Gemfile, чтобы использовать его:

На уровне экземпляра response_to не затрагивается:

И я вызываю метод экземпляра. В чем дело?

class ApplicationController < ActionController::API
end

# ...
class Api::MyController < ApplicationController

  def method1
    # ...
    respond_to do |format|
      format.xml { render(xml: "fdsfds") }
      format.json { render(json: "fdsfdsfd" ) }
    end

person アレックス    schedule 14.03.2016    source источник
comment
В чем дело? — Гм, примечания к выпуску относятся к версии 4.2, а вы используете версию 5?   -  person Jörg W Mittag    schedule 14.03.2016
comment
@ JörgWMittag, с версии 4.2 не было никаких упоминаний об изменении мем-ответов, так что это все еще очень актуально.   -  person max    schedule 14.03.2016
comment
Тем не менее, вы можете попробовать драгоценный камень ответчиков. Это чертовски круто.   -  person max    schedule 14.03.2016
comment
@max, есть ли какая-нибудь жемчужина, которая не является потрясающей? Это захватывает дух и заставляет вас кричать вааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааа!!! или что?   -  person アレックス    schedule 14.03.2016
comment
Есть много жемчужин, которые просто мех. Ответчики действительно позволяют вам пропустить кучу шаблонов и высушить ваши контроллеры. Я особенно рекомендую его для API.   -  person max    schedule 14.03.2016
comment
@max, вместо того, чтобы писать 2 строки кода, я должен использовать драгоценный камень?   -  person アレックス    schedule 14.03.2016


Ответы (2)


ActionController::API не включает модуль ActionController::MimeResponds. Если вы хотите использовать respond_to, вам нужно включить MimeResponds.

class ApplicationController < ActionController::API
  include ActionController::MimeResponds
end


class Api::MyController < ApplicationController
  def method1
    # ...
    respond_to do |format|
      format.xml { render(xml: "fdsfds") }
      format.json { render(json: "fdsfdsfd" ) }
    end
  end
end

Источник: ActionController::API docs

person max    schedule 14.03.2016

Начиная с Rails 4.2, эта функциональность больше не поставляется с Rails, но может быть легко включена в гем ответчиков (как Макс отметил в комментариях выше).

Добавьте gem 'responders' в свой Gemfile, затем

$ bundle install
$ rails g responders:install

Источники:
http://edgeguides.rubyonrails. org/4

$ bundle install
$ rails g responders:install
release_notes.html#respond-with-class-level-respond-to https://github.com/plataformatec/responders

person jpalmieri    schedule 14.11.2016
comment
Цитата из связанного источника. Уровень экземпляра response_to не изменяется. Если, как и OP, вы используете только response_to уровня экземпляра, вам не нужен гем ответчиков, просто убедитесь, что ActionController::MimeResponds включен в ваш контроллер. - person complistic; 24.01.2017