0

我有 CarrierWave 和 FileSizeValidator (https://gist.github.com/795665) 工作,但是当验证失败时我遇到了问题。

场景 1:用户尚未上传自定义头像,因此我在其仪表板中显示网站默认头像。用户尝试上传文件太大的新图像。验证按预期失败,但我无法显示站点默认头像,因为<% if @user.avatar_url(:thumb) %>CarrierWave 将所有缓存数据都保存在@user.avatar.

场景 2:与第一个场景的唯一区别是用户已经有一个自定义头像并正在尝试将其更新为新头像。这里也会发生同样的事情。我无法显示用户的实际头像,因为 CarrierWave 中存储了所有缓存数据。

场景 3: FileSizeValidator 通过,但avatar_cache不起作用。

我要完成的工作:

用户拥有站点默认头像或自定义头像,当验证失败时,我希望显示他们当前的头像(站点默认或自定义)(而不是失败的缓存)。我还想保留来自 CarrierWave 的缓存数据,以防表单提交由于另一个验证而失败(假设密码错误),因此用户不必再次选择图像来上传。我想用:avatar_cache它。

几乎当我希望缓存显示(其他验证失败)时它不会显示,而当我不希望它显示时(载波验证失败)它会显示。

模型/用户.rb

attr_accessible :username, :email, :password, :password_confirmation, :postcount, :last_activity_at, :role, :avatar, :remove_avatar, :remote_avatar_url, :avatar_cache
require 'file_size_validator'
mount_uploader :avatar, AvatarUploader
validates :avatar, :file_size => { :maximum => 512.kilobytes.to_i }

意见/用户/edit.html.erb

<% if @user.avatar_url(:thumb) %>
  <%= image_tag(@user.avatar_url(:thumb)) %>
<% else %>
  <%= image_tag('/assets/theme/avatar-blank.png') %>
<% end %>
<table>
  <% if @user.errors.messages[:avatar] %>
  <tr>
    <td colspan="2">
      <span class="error"><%= @user.errors.messages[:avatar].flatten.join %></span>
    </td>
  </tr>
  <% end %>
  <tr>
    <td style="padding-right: 20px;">Upload from your PC: </td>
    <td><input class="file optional" id="user_avatar" name="user[avatar]" type="file" /></td>
  </tr>
  <tr>
    <td>Upload from a URL: </td>
    <td>
      <input class="string url optional" id="user_remote_avatar_url" name="user[remote_avatar_url]" size="50" type="url" />
      <input class="hidden" id="user_avatar_cache" name="user[avatar_cache]" type="hidden" value="" />
    </td>
  </tr>
<% if @user.avatar_url(:thumb) %>
  <tr>
    <td>Or remove your avatar: </td>
    <td>
      <input type="checkbox" id="remove_avatar" name="user[remove_avatar]" />
    </td>
  </tr>
<% end %>

上传者/avatar_uploader.rb

class AvatarUploader < CarrierWave::Uploader::Base

  include CarrierWave::RMagick

  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  version :thumb do
    process :resize_to_limit => [120, 120]
  end
  version :mini_thumb do
    process :resize_to_limit => [50, 50]
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end

end
4

1 回答 1

0

当文件大小验证未通过时,我想出了如何摆脱 /tmp 文件。您可以将图像重置为之前的图像。

@user.avatar = @user.avatar.retrieve_from_store!(@user.avatar.identifier)

我还没有弄清楚为什么当不同的验证失败时我的 avatar_cache 不起作用,但我暂时搁置了它,稍后会重新访问。

于 2013-01-22T02:51:28.807 回答