验证失败后,CarrierWave会向用户显示头像而不是tmp

时间:2013-01-18 17:22:55

标签: ruby-on-rails carrierwave

我有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

当我想要缓存显示(其他验证失败)时它就没那么,当我不希望它显示(载波验证失败)时,它确实如此。 < / p>

模型/ user.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

1 个答案:

答案 0 :(得分:0)

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

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

我仍然没有弄清楚为什么我的avatar_cache在不同的验证失败时不起作用,但我现在暂时搁置并稍后重新访问。