Search code examples
ruby-on-railsjsonactive-model-serializers

Ruby/Rails: Why is render json: {hello: 'world'} hitting my database?


I have an action:

  def test
    _process_action_callbacks.map { |c| pp c.filter }
    render json: {hello: 'world'}
  end

That for some reason is calling my current_user function defined in my application controller.

At first I thought it was a before action that was calling my current_user function (hence _process_action_callbacks). But after stripping away all of my before actions the call remained. The only two before actions are part of rails:

:clean_temp_files
:set_turbolinks_location_header_from_session

I used caller to see where my method was getting called from. Here's the stacktrace (and method declaration):

def current_user
    pp caller
    # get the current user from the db.
end

enter image description here

As you can see, the current_user function is being called by the serialization_scope method in the serialization class. How do I prevent it from calling my current_user function?


Solution

  • Your tag indicates you are using active-model-serializers. By default current_user is the scope. To customize the scope, defined in the application-controller, you can do something like

    class ApplicationController < ActionController::Base
      serialization_scope :current_admin
    end
    

    The above example will change the scope from current_user (the default) to current_admin.

    In your case, you probably just want to set the scope in your controller (I assume it is called SomeController ;) ) you can write

    class SomeController < ApplicationController
      serialization_scope nil 
    
      def test 
        render json: {hello: 'world'} 
      end 
    
    end
    

    See for complete documentation: https://github.com/rails-api/active_model_serializers/tree/0-9-stable#customizing-scope