所以我在多个 Controller 中有一个 View 方法,它们看起来几乎完全相同:
def show
show! do |format|
format.json do
if @text.activated?
@text.log
render_for_api :texts_all, :json => @text
else
render :nothing => true
end
end
format.pdf do
pdf = QrPdf.new(@text)
send_data pdf.render, filename: "text_#{@text.id}.pdf", type: "application/pdf"
end
end
end
此模型不同,但它们都具有此方法中使用的相同属性(activated
、log
、id
)。我还可以将 render_for_api
给定的哈希值从当前的 texts_all
、documents_all
等更改为到处都相同的哈希值。
有没有办法在多个模型中使用此代码而不需要大量重复?
我很感谢每一个提示!
特别是我发现很难处理 do |format|
block 。但我也不确定将代码放在哪里以及如何将其与不同类型的模型一起使用。
谢谢。
最佳答案
如果模型确实是通用的:
def show
show_model @text
end
我不确定 show!
是什么,但你可以弄清楚这部分。粗略(未经测试):
def show_model(obj)
show! do |f|
f.json do
return render(:nothing => true) unless obj.activated?
obj.log
render_for_api :texts_all, :json => obj
end
f.pdf do
opts = { filename: "text_#{obj.id}.pdf", type: "application/pdf" }
send_data QrPdf.new(obj).render, opts
end
end
end
就 show_model
所在的位置而言,我倾向于将类似的东西放入基本 Controller 中,或者作为 mixin,但可能有更好的选择。由于我通常有一个基本 Controller ,因此很容易将其保留在那里。
关于ruby-on-rails - 在多个 Controller 中重构 "render format",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8962394/