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

Ruby on rails 验证失败后,CarrierWave向用户显示头像而不是tmp,ruby-on-rails,carrierwave,Ruby On Rails,Carrierwave,我有CarrierWave和FileSizeValidatorhttps://gist.github.com/795665 正在工作,但当验证失败时,我遇到了一个问题 场景1:用户还没有上传自定义的头像,所以我在他们的仪表板中显示站点默认的头像。用户尝试上载文件大小过大的新图像。验证像预期的那样失败,但我无法显示站点的默认化身,因为CarrierWave在@user.avatar中拥有所有缓存数据,因此为true 场景2:与第一个场景的唯一区别是,用户已经有了一个自定义的化身,并且正在尝试将其更

我有CarrierWave和FileSizeValidatorhttps://gist.github.com/795665 正在工作,但当验证失败时,我遇到了一个问题

场景1:用户还没有上传自定义的头像,所以我在他们的仪表板中显示站点默认的头像。用户尝试上载文件大小过大的新图像。验证像预期的那样失败,但我无法显示站点的默认化身,因为CarrierWave在@user.avatar中拥有所有缓存数据,因此为true

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

场景3:FileSizeValidator通过,但avatar_缓存不工作

我正在努力实现的目标:

用户具有站点默认化身或自定义化身,当验证失败时,我希望显示其当前化身站点默认或自定义,而不是失败的缓存。我还想保留来自CarrierWave的缓存数据,以防表单提交由于另一次验证(比如说错误的密码)而失败,因此用户不必再次选择要上载的图像。我想用:阿凡达缓存

所以,当我想让缓存显示其他验证失败时,它不会,当我不想让它显示载波验证失败时,它会

models/user.rb

views/users/edit.html.erb

上传者/avatar_uploader.rb


我找到了在文件大小验证未通过时如何删除/tmp文件的方法。您可以将图像重置为之前的图像

@user.avatar = @user.avatar.retrieve_from_store!(@user.avatar.identifier)
我仍然没有弄清楚为什么我的阿凡达缓存在不同的验证失败时不能工作,但我现在已经将其搁置,稍后将重新访问

<% 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 %>
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
@user.avatar = @user.avatar.retrieve_from_store!(@user.avatar.identifier)