Ruby on rails “重构”;“渲染格式”;在多个控制器中

Ruby on rails “重构”;“渲染格式”;在多个控制器中,ruby-on-rails,ruby,ruby-on-rails-3,refactoring,controller,Ruby On Rails,Ruby,Ruby On Rails 3,Refactoring,Controller,所以我在多个控制器中有一个视图方法,它看起来几乎完全相同: 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

所以我在多个控制器中有一个视图方法,它看起来几乎完全相同:

  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
此方法的模型不同,但它们都具有此方法中使用的相同属性(
已激活
日志
id
)。我还可以将
render\u for_api
给定的散列(当前为
text\u all
documents\u all
等)更改为到处都相同的散列

有没有一种方法可以在多个模型中使用这段代码,而不会产生如此巨大的重复

我感谢每一个提示! 尤其是我发现很难处理
do | format |
块。但我也不知道该将代码放在哪里,以及如何将其用于不同类型的模型


谢谢。

如果模型是真正通用的:

def show
  show_model @text
end
我不确定
显示了什么是,但这部分你可以理解。大致(未经测试):


至于
show\u model
的位置,我倾向于将这样的东西放在基本控制器中,或者作为混音器,但可能有更好的选择。因为我通常有一个基本控制器,所以很容易将它保持在那里。

这也是我的答案!根据你的应用程序的大小/复杂程度,我会将它作为一个私有方法放入ApplicationController
show来自继承的_资源gem()。好的,那么你认为我可以把它放在我的应用程序中吗。每个控制器都继承自此控制器,好主意吗?@choise There,或您自己的基本控制器-但它看起来像
继承的\u资源
有自己的基类,所以您的应用程序控制器需要扩展它,如果它还没有。也不知道基类方法做什么(方法
),所以需要确保它与任意模型兼容。
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