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)で使用されています。私はtexts_alldocuments_all等の現在のハッシュからrender_for_apiのハッシュを変更して、どこでも同じハッシュにすることができます。

このコードを複数のモデルで使用するには、このような重大な重複がありませんか?

すべてのヒントに感謝しています! 特に、私は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命として、私はベースコントローラに、あるいはミックスインとしてそのようなものを置く傾向があるが、より良いオプションがあるかもしれません。私は通常ベースコントローラーを持っているので、そこに保持するのは簡単です。

+0

それも私の答えでした!あなたのアプリケーションのサイズ/複雑さに応じて私はPrivateControlとしてApplicationControllerにドロップするだけです –

+0

'show!'はinherited_resources gem(https://github.com/josevalim/inherited_resources)から来ます。 私はapplication_controller.rbの中に入れることができると思いますか?すべてのコントローラはこれを継承しています。良いアイデアですか? – choise

+0

@choiseそこに、またはあなた自身のベースコントローラ - しかし、 'inherited_resources'はそれ自身の基本クラスを持っているように見えるので、あなたのアプリケーションコントローラはそれを拡張する必要があります。また、基本クラスのメソッド( '!'メソッド)が何をしているのかわからないので、それが任意のモデルと互換性があることを確認する必要があります。 –

関連する問題