是否可以在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
移动到控制器操作中,则它可以正常工作。
是否有一个过滤器可以让我干掉控制器并将渲染调用移动到基本控制器?
答案 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中,这将延迟整个请求。