Undefined instance method "respond_to" in Rails 5 API Controller
Asked Answered
F

2

60

In rails 5 created with --api I have an error

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

However, in the documentation for rails 4.2 it says http://edgeguides.rubyonrails.org/4_2_release_notes.html

respond_with and the corresponding class-level respond_to have been moved to the responders gem. Add gem 'responders', '~> 2.0' to your Gemfile to use it:

Instance-level respond_to is unaffected:

And I'm calling the instance method. What's the matter?

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
Fulfillment answered 14/3, 2016 at 9:23 Comment(6)
"What's the matter?" – Um, the release notes are for 4.2 and you are using 5?Gaudet
@JörgWMittag, there has not been any mention of changing meme-responds since 4.2 so it is still very relevant.Tepid
You might want to try the responders gem though. Its pretty damn awesome.Tepid
@max, is there any gem that's not awesome? It takes your breath away and makes you yell "waayyyyy, it's pretty awesome, yyyaaahhhhh!!!" or what?Fulfillment
There are plenty of gems that are just meh. Responders really lets you skip a bunch of boilerplate and DRY out your controllers. I especially recommend it for API's.Tepid
@max, instead of writing 2 lines of code I should use a gem?Fulfillment
T
136

ActionController::API does not include the ActionController::MimeResponds module. If you want to use respond_to you need to include MimeResponds.

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


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

Source: ActionController::API docs

Tepid answered 14/3, 2016 at 10:31 Comment(0)
A
19

As of Rails 4.2, this functionality no longer ships with Rails, but can easily be included with the responders gem (like Max noted in comments above).

Add gem 'responders' to your Gemfile, then

$ bundle install
$ rails g responders:install

Sources:
http://edgeguides.rubyonrails.org/4_2_release_notes.html#respond-with-class-level-respond-to https://github.com/plataformatec/responders

Atone answered 14/11, 2016 at 4:23 Comment(1)
Quote from linked source "Instance-level respond_to is unaffected". If like OP your only using the instance-level respond_to you dont need the responders gem, just make sure ActionController::MimeResponds has been included in your controller.Berm

© 2022 - 2024 — McMap. All rights reserved.