纸夹无法保存,没有错误提示。

4

我遇到了问题-查看了文档、教程等,但我不确定哪里出错了。

项目中的另一个模型使用了Paperclip,并且在测试时是有效的。它将附件文件信息保存和检索到数据库中,并将文件放入public/system的子文件夹中。我基本上将相关代码复制到了我正在处理的模型中。

该模型有以下代码:

has_attached_file :document

这个模型链接的表必须有必要的列:

document_file_name 
document_content_type
document_file_size
document_updated_at

编辑视图中有以下内容(使用Haml编写):
%h1 Knowledge Base: Edit Article
= message_block :on => @article

- form_for(@article, :url => knowledge_base_article_path(@article),  :html => {:multipart => true}) do |f|

  #knowledgebase.clearfix
    %label Upload KB Document:
    %br
    = f.file_field :document
    - if @article.document.exists?
      %p
        = link_to "Current KB Attachment", @article.document.url
      %p
        = f.check_box :remove_document
  <br>

  = render :partial => "form", :locals => {:f => f}
  = submit_tag "Save changes"
  = link_to "Cancel", knowledge_base_article_path(@article)

当我保存模型实例时,可以在日志中看到Rails意识到我正在尝试上传的文件:
Processing KnowledgeBase::ArticlesController#update (for 127.0.0.1 at 2010-11-18 19:21:01) [PUT]
  Parameters: {"article"=>{"document"=>#<File:/var/folders/EZ/EZKwznNSGq4PAI4ll9NUD++++TI/-Tmp-/RackMultipart20101118-58632-19nvbc8-0>, "question"=>"Craig's Sandbox", "active"=>"0", "answer"=>"Nothing here, this is to test attachment functionality"}, "commit"=>"Save changes", "action"=>"update", "_method"=>"put", "authenticity_token"=>"MfH6RgLAQLnRBuf9WxgqWA+mIrDoBtYF+d4MW5DNCC0=", "id"=>"886", "controller"=>"knowledge_base/articles"}

然而,对于四个“document_”*列,db值根本没有更新,它们仍然为NULL。同一张表中的其他列已经被成功更新。
只是为了确保db列名正确,我将db列改成了其他名称,并在查看时出现错误,因此我知道db列名是正确的。
为了测试附件检索,我手动在public/system内创建了子文件夹(当模型实例保存时,附件将放在其中),并手动修改了表中的四个“document_”*列。然后我去到上述相同的视图,它确实显示了相关的正确附件。
我注意到,当“remove_document”被选中时,我也无法删除附件。“document_”*的db值保持不变。
就像那4列的读操作有效一样,但写操作却无效(尽管如果我在编辑视图页面上修改模型实例中的某些内容,我可以让Rails修改同一张表中的其他列)。
有什么想法吗?我确定我错过了一些明显的东西。
1个回答

8

你在控制器中如何更新 Article 模型?是使用 @article.update_attributes(params[:article]) 吗?

如果是这样的话,可能是由于不正确使用了 attr_protected 或者 attr_accessible 引起的。在这种情况下,你可以尝试使用以下方式分配文件:

@article.document = params[:article][:document]

1
谢谢。罪魁祸首确实在控制器中,已经修复。我使用了 params[:some_namespace_before_article] 而不是 params[:article],现在已经解决了!标记为已解决。 - Craig Flannagan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接