3

私はRails3アプリにPrawnを介してPDF生成を追加しようとしています。Railscastをフォローしていますが、インスタンス変数をコントローラーから作成した別のクラスに渡そうとするまで、すべてが順調に進んでいました。

コントローラのアクションは次のようになります。

def show #shows some material
@material = Material.find(params[:id])
respond_to do |format|
  format.html
  format.pdf do
    pdf = MaterialPdf.new(@material)
    send_data pdf.render, filename: "material_#{@material.id}.pdf", 
                          type: "application/pdf",
                          disposition: "inline"
  end
end

終わり

そして、material_pdf.rbファイルは次のようになります。

class MaterialPdf < Prawn::Document
  def initialize(material)
    super
    @material = material
    text "Placeholder text"
  end
end

ログから表示されるエラーメッセージは奇妙です。

Material Load (0.1ms)  SELECT "materials".* FROM "materials" WHERE "materials"."id" = ? ORDER BY materials.created_at DESC LIMIT 1  [["id", "27"]]
DEPRECATION WARNING: You're trying to create an attribute `info'. Writing arbitrary attributes on a model is deprecated. Please just use `attr_writer` etc. (called from initialize at .../app/pdfs/material_pdf.rb:3)

クエリが正常に表示され、属性「info」を作成しようとしていないため、奇妙です。理解できません。ヘルプ。

4

1 に答える 1

2

その属性を作成しようとしているのはエビです:

http://prawn.majesticseacreature.com/docs/0.11.1/Prawn/Document.html

私はそれをよりよく説明すると思います:

属性「通貨」を作成するための非推奨の警告

とにかく、私はあなたが実際に超間違って呼んでいると思います。Document.newはオプションハッシュを取ります:

def initialize(options={},&block)

したがって、マテリアルインスタンスではなく、それをスーパークラスに渡す必要があります。

class MaterialPdf < Prawn::Document
  def initialize(material, prawn_opts = {})
    super(prawn_opts)
    @material = material
    text "Placeholder text"
  end
end
于 2013-02-27T22:05:25.333 に答える