我有一个最初使用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上的表单重新显示上传工作。
答案 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