2012-03-20 33 views
6

我有一个最初使用Paperclip进行文件上传的rails应用程序,但是,正如我看到CarrierWave显然具有通过重新显示形式的“持久上传”类型功能,我决定试一试。CarrierWave在表单重新显示后没有保存上传

在我看来,我有以下几点:

= f.input :attachment 
= f.hidden_field :attachment_cache 

如果表单验证失败而被重新显示哪个正确缓存文件,但是当我纠正验证错误并重新提交,附件不被处理。

Started POST "/section/model" for 127.0.0.1 at 2012-03-20 08:51:56 +0000 
    Processing by Client::WishesController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"zkdPQBsAnsNzx555rkwZ5+clfnLaXg+NtL+GdFei188=", "model"=>{"title"=>"Sample", "content"=>"Sample content", "contact_name"=>"Mr Sample", "contact_email"=>"[email protected]", "attachment_cache"=>"20120320-0851-42559-1644/SampleAttachment.pdf"}, "commit"=>"Create Wish"} 
    Client Load (0.3ms) SELECT `clients`.* FROM `clients` WHERE `clients`.`id` = 1 LIMIT 1 
    (0.2ms) BEGIN 
    SQL (0.4ms) INSERT INTO `models` (`attachment`, `client_id`, `contact_email`, `contact_name`, `content`, `created_at`, `status`, `title`, `updated_at`, `upload_content_type`, `upload_file_name`, `upload_file_size`, `upload_updated_at`) VALUES (NULL, 1, '[email protected]', 'Mr Sample', 'Sample content', '2012-03-20 08:51:56', 'Unresolved', 'Sample', '2012-03-20 08:51:56', NULL, NULL, NULL, NULL) 

这似乎通过在PARAMS的attachment_cache被正确地传递附件,但它不然后保存,因为它不具有PARAMS附件[:模型] [:附件]字段。

它没有在carrierwave部分中提出任何进一步的步骤,以使上传在CarrierWave GitHub上的表单重新显示中工作。

+0

它的工作原理如果我创建/更新与质量赋值,并设置单独的变量,但我想知道是否有办法做到这一点没有质量分配? – HaaR 2012-03-20 11:03:49

+0

考虑[打开票](https://github.com/jnicklas/carrierwave/issues)。 – 2012-03-20 20:45:13

+1

你找到了答案吗? – user749798 2013-05-08 01:10:55

回答

3

尝试填充avatar_cache的值,以便在验证失败时,它会在形式的预先填充:

= f.hidden_field :attachment_cache, :value => @model.attachment_cache 

哪里@model是型号名称

这似乎为工作我在多次重新加载同一表单时(即多次验证失败时)。我认为他们从文档中排除了这一点。

+0

这不适用于嵌套形式 – Francisco 2016-05-16 20:52:59

+0

这对我来说不起作用(Rails 4.2.5)。 – fatuhoku 2016-09-26 16:10:05

+0

您还必须将字段名称添加到强参数 – 2017-04-16 05:33:29

0

原因是'改变了?'检查,当验证错误时,我们将缓存文件传递到不是数据库表列的#{model} _cache字段,因此它不保存对象,因为在AR的观点上没有任何更改。

我做了一个黑客通过建立模型的方法,包含的文件,使这项工作: “数据”是列名

def data_cache=(text) 
    @changed_attributes.merge!("data" => nil) 
    super 
end 

希望这有助于。

+0

我编辑了此答案以删除背景故事。答案应该回答这个问题,不要包含无关的信息。随时查看我的更改,并欢迎来到StackOverflow! – BradleyDotNET 2014-03-25 19:52:37

0

对我来说,问题是,我不得不

accepts_nested_attributes_for :avatars, allow_destroy: true, reject_if: lambda { |avatar| avatar[:file].blank? } 

所以我拒绝该文件,因为文件是不存在

注意的是,文件本身并没有坚持这一点很重要,但只是文件缓存。这就是为什么carrierwave docs建议:

这可能是一个好主意,显示一个文件已被上传,在图像的情况下,用户,小缩略图会是一个很好的指标:

1

这是一个有点老问题,但它为我工作后,我加入了强大的参数给控制器,就像这样:

#controller 
def object_params 
    params.require(:object).permit(:attachment, :attachment_cache) 
end 

#view 
<%= f.file_field :attachment %> 
<%= f.hidden_field :attachment_cache %> 
1

这将解决您的问题100%

请看看

accepts_nested_attributes_for :avatars, allow_destroy: true, 
reject_if: lambda { |avatar| avatar[:avatar].blank? and avatar[:avatar_cache].blank?} 

在这里,我们将拒绝当两个avatar[:avatar]avatar[:avatar_cache]是空白

0

要添加到@马尔科的回答头像:

如果您用的是Active管理员,你”需要将缓存的文件添加到permit_params行。

permit_params: :title, :file, :file_cache 
相关问题