2012-01-22 41 views
2

,所以我得在多個控制器視圖方法,它主要是長得一模一樣:重構「呈現格式」中的多個控制器

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_alldocuments_all等哈希,其無處不在。

有沒有一種方法可以在多個模型中使用此代碼而不會有這種巨大的重複?

我很感謝每一個提示! 特別是我覺得很難處理do |format|塊。但我也不確定在哪裏放置代碼以及如何將它用於不同類型的模型。

謝謝。

回答

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的生活,我傾向於把這樣的事情到基本控制器,或者作爲一個mixin,但有可能是更好的選擇。由於我通常有一個基礎控制器,所以保持它很容易。

+0

這將是我的答案!根據您的應用程序的大小/複雜程度,我將其作爲私有方法放入ApplicationController –

+0

'show!'來自inherited_resources gem(https://github.com/josevalim/inherited_resources)。 沒關係,所以你認爲我可以把它放在我的application_controller.rb裏面。每一個控制器都從這個繼承,這是個好主意? – choise

+0

@choise在那裏,或者你自己的基礎控制器 - 但它看起來像'inherited_resources'有它自己的基類,所以你的應用程序控制器將需要擴展,如果它尚未。也不知道基類方法的作用('!'方法),所以你需要確保它與任意模型兼容。 –