Ruby on rails Carrier在表单重新显示后未保存上载

Ruby on rails Carrier在表单重新显示后未保存上载,ruby-on-rails,ruby,upload,carrierwave,Ruby On Rails,Ruby,Upload,Carrierwave,我有一个rails应用程序,它最初使用回形针上传文件,但是,当我看到CarrierWave显然在表单重新显示上有一个“持久上传”类型的功能时,我决定尝试一下 我认为我有以下几点: = f.input :attachment = f.hidden_field :attachment_cache 如果表单验证失败并重新显示,它会正确缓存文件,但是当我更正验证错误并重新提交时,附件不会被处理 Started POST "/section/model" for 127.0.0.1 at 2012-03

我有一个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中的附件缓存正确地传递了附件,但由于没有params[:model][:attachment]字段,因此没有保存附件


它没有在carrierwave部分说明任何进一步的步骤,以使上传能够在表单上重新显示。

尝试填充avatar\u缓存的值,以便在验证失败时,将其预先填充到表单中:

= f.hidden_field :attachment_cache, :value => @model.attachment_cache
其中
@model
是您的型号名称


当同一表单多次重新加载时(即验证多次失败),这似乎对我有效。我认为他们在文档中没有提到这一点。

原因是“已更改”检查,当验证出错时,我们将缓存文件传递到#{model}\u缓存字段中,该字段不是数据库表列,因此它不会保存对象,因为AR的视图中没有任何更改

我在模型中创建了一个包含该文件的方法,从而实现了这一点: “data”是列名的名称

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

希望这能有所帮助。

对我来说,问题是我

accepts_nested_attributes_for :avatars, allow_destroy: true, reject_if: lambda { |avatar| avatar[:file].blank? }
所以我拒绝了文件,因为文件不在那里

需要注意的是,文件本身并不持久,而只是文件缓存。这就是为什么carrierwave建议:


向用户显示文件已上载可能是个好主意,在图像的情况下,一个小缩略图将是一个很好的指示器:

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

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

#view
<%= f.file_field :attachment %>
<%= f.hidden_field :attachment_cache %>
#控制器
定义对象参数
参数require(:object).permit(:附件,:附件\u缓存)
结束
#看法

这将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\u cache]
都为空时,我们将拒绝使用avatar,以补充@marko的答案:

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

permit_params: :title, :file, :file_cache

如果我用大量的赋值来创建/更新,并且设置单独的变量,但我想知道是否有一种方法可以在没有大量赋值的情况下完成它。考虑一下这个问题。你找到了答案吗?你还必须将字段名添加到强PARAMTRI编辑中,以从这个答案中删除后面的故事。答案应回答问题,不包括无关信息。请随时查看我的更改,并欢迎使用StackOverflow!您还必须将字段名添加到强参数中