多个控制器中的重构“渲染格式”

时间:2012-01-22 16:01:00

标签: 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
      end
      format.pdf do
        pdf = QrPdf.new(@text)
        send_data pdf.render, filename: "text_#{@text.id}.pdf", type: "application/pdf"
      end
    end
  end

此模型不同,但它们都具有此方法中使用的相同属性(activatedlogid)。我也可以将当前render_for_apitexts_all等的documents_all给定哈希值更改为其所在地的哈希值。

有没有办法在多个模型中使用这个代码而没有这么大的重复?

我很感激每一个提示! 特别是我发现很难处理do |format|块。但我也不确定在何处放置代码以及如何将它与不同类型的模型一起使用。

谢谢。

1 个答案:

答案 0 :(得分:3)

如果模型真的是通用的:

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生活的地方而言,我倾向于把这样的东西放到基础控制器中,或作为混合物,但可能有更好的选择。由于我通常有一个基本控制器,所以很容易将它保留在那里。