所以我在多个控制器中有一个视图方法,看起来基本上是完全相同的:

  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

这方面的模型不同,但它们都具有此方法中使用的相同属性(activatedlogidrender_for_api)。我还可以将当前为texts_alldocuments_all等的给定散列更改为其所有位置都相同的散列。
有没有一种方法可以在多个模型中使用这些代码,而不需要如此巨大的重复?
我感谢每一个暗示!
尤其是我发现很难处理do |format|块。但我也不知道该把代码放在哪里,以及如何在不同类型的模型中使用它。
谢谢您。

最佳答案

如果模型是真正通用的:

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所处的位置,我倾向于将类似的东西放入一个基本控制器,或者作为一个mixin,但可能有更好的选择。因为我通常有一个基本控制器,所以很容易把它放在那里。

10-05 20:33