我的控制器中有以下方法
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。
答案 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