around_action用于控制器轨道中的渲染视图

时间:2014-12-23 22:52:09

标签: ruby-on-rails-4 filter controller render

我的控制器中有以下方法

around_action :warp_in_transaction_and_begin, only: :update


def warp_in_transaction_and_begin
  ActiveRecord::Base.transaction do
    begin
      render json: yield
    rescue => e
      ActiveRecord::Rollback
      render json: { error: e.to_s }
    end
  end
end

但问题是引发错误:

Missing template topics/update...

因为轨道预期"渲染"在方法更新中,而不是在action_around中。 但是我需要使用render json和我的方法更新的返回值。

为例:

def update
   hash = { foo: :bar }
   topic.update(hash)
   hash
end

我希望在json中渲染哈希对象。

我该怎么做?

THX。

1 个答案:

答案 0 :(得分:0)

这里有一堆错误,主要是因为你与Rails的工作方式有所不同。

首先,动作的返回值并不实用。 Rails不希望你的行为返回任何东西,并且它不会任何带有返回值的东西。 Rails希望您的操作输出为render或重定向,如果您不做其中任何一项,您就会隐式要求Rails为您执行渲染。这就是Rails尝试渲染topics/update的原因。

你也在滥用过滤器。它们的目的是转换动作的输出,而不是输出的唯一生成器。

您应该呈现JSON的方式是使用您的操作中的respond_with。首先,使用respond_to来定义控制器可以输出的数据种类......

class MyController < ApplicationController
  respond_to :json
end

然后,回复您想要回复的值。

def update
  hash = { foo: :bar }
  topic.update(hash)
  respond_with hash
end