如何从ApplicationController中的after_action过滤器为所有动作渲染json?

时间:2014-09-02 16:52:17

标签: ruby-on-rails api controller

是否可以在Rails ApplicationController中创建一个after_filter方法,该方法在每个动作上运行并呈现给JSON?我正在构建一个API,我想为控制器中的每个动作渲染输出到JSON。

clients_controller.rb

def index
  @response = Client.all
end

application_controller.rb

...
after_action :render_json
def render_json
  render json: @response
end

永远不会执行after_action,代码将以:

中止
  

缺少模板。缺少模板客户端/索引,......

如果将render json: @response移动到控制器操作中,则它可以正常工作。

是否有一个过滤器可以让我干掉控制器并将渲染调用移动到基本控制器?

1 个答案:

答案 0 :(得分:4)

您无法渲染after_action / after_filter。回调after_action用于在渲染后执行操作。所以渲染after_action太晚了 但是你的例外只是因为你错过了JSON模板。我建议使用RABL(它为您的JSON响应提供了很大的灵活性,并且还有一个Railscast。然后你的控制器可能看起来像:

class ClientsController < ApplicationController
  def index
    @clients = Client.all
  end
  def show
    @client = Client.find params[:id]
  end
end

不要忘记制作你的兔子模板 例如客户端/ index.rabl:

collection @clients, :object_root => false

attributes :id
node(:fancy_client_name) { |attribute| attribute.client_method_generating_a_fancy_name }

但是如果你仍然希望更具说明性,你可以利用ActionController::MimeResponds.respond_to之类的:

class ClientsController < ApplicationController
  respond_to :json, :html
  def index
    @clients = Client.all
    respond_with(@clients)
  end
  def show
    @client = Client.find params[:id]
    respond_with(@client)
  end
end

顺便说一下。请注意,如果将代码放入after_action中,这将延迟整个请求。