1

私のアプリケーションには、基本的にペーパークリップ ファイルのみを含むモデルであるファイル モデルがあります。ネストされたフォームを使用していくつかのファイルをアップロードしようとしていますが、ファイル モデルを保存するたびに実際のファイルがアップロードされますが、ペーパークリップの既定の列はすべて nil のままです。ここに私が取り組んでいるモデルがあります:

class Arquivo < ActiveRecord::Base

    attr_accessible :arquivo, :arquivo_file_name, :arquivo_file_size, :arquivo_content_type, :arquivo_updated_at

    has_one :aluno_documento

    attr_accessor :arquivo_file_name, :arquivo_file_size, :arquivo_content_type, :arquivo_updated_at

    has_attached_file :arquivo

    validates :arquivo_file_name, :presence => true
    validates_attachment_presence :arquivo
    validates_attachment_size :arquivo, :less_than => 1.megabyte, :if => :arquivo
    validates_attachment_content_type :arquivo, :content_type => 'application/pdf', :message => :invalid, :if => :arquivo
end

これは、Arquivo を構築している (マルチレベル) ネストされたフォームのパラメーターです。

{"arquivo"=>#<ActionDispatch::Http::UploadedFile:0x00000009176958 @original_filename="SGCAv3.7.pdf", @content_type="application/pdf", @headers="Content-Disposition: form-data; name=\"pessoa[alunos_attributes][0][aluno_documentos_attributes][0][arquivo_attributes][arquivo]\"; filename=\"SGCAv3.7.pdf\"\r\nContent-Type: application/pdf\r\n", @tempfile=#<File:/tmp/RackMultipart20121123-16651-se21y5>>}

IRB でデバッグすると、次のようになります。

ar = Arquivo.new(passing params above)
    => #<Arquivo id: nil, arquivo_file_name: nil, arquivo_content_type: nil, arquivo_file_size: nil, arquivo_updated_at: nil> 
ar.arquivo_file_name
    => "SGCAv3.7.pdf"
ar.arquivo_content_type
    => "application/pdf"
ar.save
    => true
ae = Arquivo.last
    => #<Arquivo id: 9, arquivo_file_name: nil, arquivo_content_type: nil, arquivo_file_size: nil, arquivo_updated_at: nil>
ae.valid?
    => false
ae.arquivo_file_name
    => nil

これが何かばかげたことによって引き起こされていることを期待して探しましたが、特に Arquivo オブジェクトが実際に検証されているのにすべてのフィールドが空のままである部分で、これがどのように発生するのか理解できません?!?!

4

1 に答える 1

1

私は問題を見つけましたが、実際にはペーパークリップとはほとんど関係がありませんでした:

ペーパークリップが添付された Arquivo モデルには、「attr_accessible」とタグ付けされたペーパークリップ属性がありませんでした。Rails 3.2 には属性のホワイト リストがあり、属性がホワイト リスト (attr_accessible) にない場合、フォームを使用して割り当てることはできません (詳細情報が必要です)。これは、フォームに手動でフィールドを追加し、必要以上のデータを送信するユーザーを保護するために使用されます。

通常、Rails は「属性を一括割り当てできません: attr1、attr2、...」という例外をスローしますが、この場合はそうではありませんでした。ペーパークリップがこのエラーを無視したためなのか、ネストレベルが原因なのか、その両方なのかはまだわかりません。ホワイトリストにペーパークリップの属性を追加するだけでうまくいきました。

于 2012-11-27T12:59:59.667 に答える