表单重新显示后,CarrierWave不保存上传

时间:2012-03-20 09:06:08

标签: ruby-on-rails ruby upload carrierwave

我有一个最初使用Paperclip进行文件上传的rails应用程序,但是,当我看到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"=>"sample@example.com", "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, 'sample@example.com', '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 [:model] [:attachment]字段。

它没有说明在“运营波段”上有任何进一步的步骤,可以使CarrierWave GitHub上的表单重新显示上传工作。

6 个答案:

答案 0 :(得分:3)

这是一个古老的问题,但在我将强参数添加到控制器后,它对我有用,如下所示:

NumberFormat.getNumberInstance(Locale.US).format(yourNumber);

答案 1 :(得分:2)

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

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

@model是模型的名称

当多次重新加载相同的表单时(即验证失败多次),这似乎对我有用。我认为他们不在文档中。

答案 2 :(得分:2)

这将解决您的问题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]都是空白

,我们会拒绝您的头像

答案 3 :(得分:0)

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

我通过在包含该文件的模型中创建一个方法来完成这项工作: "数据"是列名

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

希望这有帮助。

答案 4 :(得分:0)

对我来说,问题是我有

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

所以我拒绝了该文件,因为该文件不在那里

重要的是要注意文件本身不会持久存在,而只是文件缓存。这就是载波docs建议:

的原因

向用户显示已上传文件可能是一个好主意,对于图片,小缩略图将是一个很好的指标:

答案 5 :(得分:0)

添加到@marko的答案:

如果您使用的是Active Admin,则需要将缓存的文件添加到permit_params行。

permit_params: :title, :file, :file_cache