Paperclip不保存文件属性

时间:2012-11-23 12:02:05

标签: ruby-on-rails paperclip nested-forms

我的应用程序中有一个文件模型,它基本上只是一个只有paperclip文件的模型。我正在尝试使用一些嵌套表单上传一些文件,但每次保存文件模型时,实际文件都会上传,但所有回形针默认列都保持为零。这是我正在使用的模型:

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对象实际被验证的部分,但所有的字段都是空的?! ?!

1 个答案:

答案 0 :(得分:1)

我发现了问题,它实际上与Paperclip没什么关系:

事实证明,我的带有回形针附件的Arquivo模型没有标记为“attr_accessible”的回形针属性。在Rails 3.2中,您有一个白名单属性列表,如果属性不在白名单(attr_accessible)上,则无法使用表单进行分配(需要更多信息)。这用于保护用户手动向表单添加字段并提交比他应该更多的数据。

通常情况下,Rails会抛出“无法大量分配属性:attr1,attr2,...”异常,但在这种情况下它没有。我仍然不知道是不是因为回形针忽略了这个错误,还是因为嵌套级别或两者兼而有之。只需将回形针属性添加到白名单即可。