在rails中使用两个字段上传2张图片。

问题描述 投票:0回答:1

我有一个博客的表格,我想有两个图片字段。一张图片是封面(显示),另一张图片将作为预览(索引)。我的表格看起来是这样的。

<%= semantic_form_for @blog, :html => { :multipart => true } do |f| %>
<%= t :Choose_File_for_cover %> <%= f.file_field :image_path, id: "avatar-upload2", required: true %>
<img id="img_prev3" width="100%" height=200 src="#" alt="your image" class="img-thumbnail hidden"/>

<%= t :Choose_File_for_homepage %> <%= f.file_field :homepagepic, id: "avatar-upload3", required: true %>
<%= f.hidden_field :image_path_cache %>
<%= f.hidden_field :homepagepic_cache %>
<%= f.actions do %>
<%= f.action :submit, :as => :input %>
<% end %>
<% end %>

我的模型是这样的:

class Blog < ApplicationRecord
  belongs_to :user
  acts_as_taggable
  mount_uploader :image_path, BlogUploader
  mount_uploader :homepagepic, BlogcoverUploader
end

当我只有两个字段的时候,它的效果很好 image_path (封面),但当我为新的字段添加了一个 homepagepic,我得到一个 ROLLBACK 在验证时。

谁能帮我解决如何在同一个表单上通过两个独立的字段选择文件的问题,谢谢。

ruby-on-rails
1个回答
2
投票

你提供的代码非常稀疏,如果能看到更多的代码会很有帮助(例如控制器和上传器)。

不过,我可以猜测一下。image_path 是Rails提供的一个现有的帮助方法(参见 https:/api.rubyonrails.orgclassesActionViewHelpersAssetUrlHelper.html#method-i-image_path。). 我完全不知道当你用这个作为表格字段的名称时会发生什么。也有可能是因为你把提交按钮声明为输入(我只见过和使用了 as: :button 对于 f.action :submit).

所以总体来说,我会选择下面的方法。

  • 把你的上传字段改名为 cover_image 而另一个则是 preview_image (这是你在帖子中描述的各自的目的,所以你应该给它们起相应的名字)
  • 改为 button 并从你的模板中删除所有的噪音,并从最基本的开始:两个上传字段,没有其他的东西(见下面的示例代码--注意,我还没有测试,但它应该工作或非常接近工作
  • 在这之后,开始添加噪音(即翻译、缓存字段等)。

测试每一步之后是否还能工作。如果你能写一个Capybara测试,就这么做--否则就手动测试。

如果你有问题,请随时提问。


<%= semantic_form_for @blog, html: { multipart: true } do |f| %>
  <%= f.file_field :cover_image %>
  <%= f.file_field :preview_image %>

  <%= f.actions do %>
    <%= f.action :submit, as: :button %>
  <% end %>
<% end %>
class Blog < ApplicationRecord
  belongs_to :user

  acts_as_taggable

  mount_uploader :preview_image, BlogUploader
  mount_uploader :cover_image, BlogcoverUploader
end

1
投票

正如前面的海报所说,如果没有所有的拼图,很难调试你的代码。A ROLLBACK 是由于一个或多个验证失败而发生的。

任何时候你有一个 ROLLBACK 你可以加一个 !createupdate 方法被调用,ActiveRecord会抛出一个错误,告诉你为什么在对象上的 ROLLBACK 发生,而不是优雅地失败。

一旦你知道为什么你的对象没有持久化,你可以检查表单提交的控制器动作的参数。也许你忘了通过强参数将一个参数列入白名单?

相关问题
热门问答
最新问题