rails 3: ошибка несущей волны default_url, не используется правильная версия

Привет, я пытаюсь заставить разные версии изображения по умолчанию работать с моим avatar_uploader. У меня это работало раньше со 2 версией, но я не добавил 4 версии, кажется, есть ошибка, которую я не могу понять. Когда я ссылаюсь на изображение по умолчанию моей версии :small, оно отображает изображение по умолчанию версии :large. Я удалил файл large_avatar_defaualt.png из папки public/images/fallback и подтвердил, что запрос действительно ищет файл large_avatar_default.png. Как вы можете видеть в моем коде ниже, я указываю на правильную версию аватара, есть идеи, почему это происходит?

Started GET "/users/example123/following" for 127.0.0.1 at 2011-10-29 13:16:31 -0700
  Processing by UsersController#following as JS
  Parameters: {"id"=>"example123"}
  User Load (62.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  User Load (3.5ms)  SELECT "users".* FROM "users" WHERE "users"."cached_slug" = 'example123' LIMIT 1
  User Load (2.1ms)  SELECT "users".* FROM "users" INNER JOIN "relationships" ON "users".id = "relationships".followed_id WHERE (("relationships".follower_id = 1)) LIMIT 30 OFFSET 0
Rendered users/_user.html.erb (3.5ms)
Rendered users/_users.html.erb (5.5ms)
Rendered users/following.js.erb (7.5ms)
Completed 200 OK in 312ms (Views: 25.2ms | ActiveRecord: 69.2ms)


Started GET "/images/fallback/large_avatar_default.png" for 127.0.0.1 at 2011-10-29 13:16:31 -0700

ActionController::RoutingError (No route matches "/images/fallback/large_avatar_default.png"):


Rendered /Users/iHal/.rvm/gems/ruby-1.9.2-p290@rails3/gems/actionpack-3.0.7/lib/action_dispatch/mid

dleware/templates/rescues/routing_error.erb within rescues/layout (1.1ms)

Просмотры

пользователи.html.erb

<% if users.empty? %>
<%= @empty_msg %>
<% else %>
<%= @title %>
<% users.each do |user| %>
<%= render 'user', :user => user %>
<% end%>
<% end%>

пользователь.html.erb

<div>
  <%= small_avatar_for user %>
  <%= link_to user.name, user %>
  <%= link_to user.username, user %>
</div>

users_helper.rb

module UsersHelper

  def tiny_avatar_for(user)
     image_tag(user.avatar_url(:tiny).to_s, :alt => "avatar", :class => "round-3")
   end

  def small_avatar_for(user)
    image_tag(user.avatar_url(:small).to_s, :alt => "avatar", :class => "round-3")
  end

   def medium_avatar_for(user)
       image_tag(user.avatar_url(:medium).to_s, :alt => "avatar", :id => "align-middle", :class => "round-3")
     end

  def large_avatar_for(user)
     image_tag(user.avatar_url(:large).to_s, :alt => "avatar", :class => "round-10", :id => "center-big-avatar")
   end
end

класс AvatarUploader ‹ CarrierWave::Uploader::Base

 # Include RMagick or ImageScience support:
  include CarrierWave::MiniMagick
  # include CarrierWave::ImageScience

  # Choose what kind of storage to use for this uploader:
  #storage :file
  # storage :s3

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  # Provide a default URL as a default if there hasn't been a file uploaded:
  def default_url
   "/images/fallback/" + [tiny, "tiny_avatar_default.png"].compact.join('_')
   "/images/fallback/" + [small, "small_avatar_default.png"].compact.join('_')
   "/images/fallback/" + [medium, "medium_avatar_default.png"].compact.join('_')
   "/images/fallback/" + [large, "large_avatar_default.png"].compact.join('_')
  end

  # Process files as they are uploaded:
  # process :scale => [200, 300]
  process :resize_to_fit => [600, 600]

  # def scale(width, height)
  #   # do something
  # end

  # Create different versions of your uploaded files:

  version :large do
    process :resize_to_fill => [165, 165]
  end
  version :medium do
    process :resize_to_fill => [75, 75]
  end
  version :small do
    process :resize_to_fill => [45, 45]
  end
  version :tiny do
    process :resize_to_fill => [20, 20]
  end
  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
  def extension_white_list
    %w(jpg jpeg gif png)
  end

  # Override the filename of the uploaded files:
  def filename
    "avatar.#{File.extname(original_filename).downcase}" if original_filename
  end
  def filename
    if Rails.env.production?
      name_s3
    else
      name_file
    end
  end

  def name_s3
    # S3 storage class is Carrierwave::Storage::S3::File
    "avatar.#{File.extname(original_filename).downcase}" if original_filename     
  end

  def name_file
    # :file storage class is Carrierwave::Storage::File
    "avatar.#{model.avatar.file.extension}" if original_filename
  end
end

person user1009762    schedule 29.10.2011    source источник
comment
Вы должны обновить принятый ответ до того, который дал @omarvelous ниже.   -  person mkelley33    schedule 13.12.2012


Ответы (2)


Это должно сработать!

def default_url
  "/images/fallback/" + [version_name, "avatar_default.png"].compact.join('_')
end

version_name будет передавать имя запрошенной версии.

В противном случае CSS — ваш друг!

person omarvelous    schedule 07.12.2011

Ответ лежит в вашем коде:

# Provide a default URL as a default if there hasn't been a file uploaded:
def default_url
  "/images/fallback/" + [tiny, "tiny_avatar_default.png"].compact.join('_')
  "/images/fallback/" + [small, "small_avatar_default.png"].compact.join('_')
  "/images/fallback/" + [medium, "medium_avatar_default.png"].compact.join('_')
  "/images/fallback/" + [large, "large_avatar_default.png"].compact.join('_')
end

default_url возвращает только одно значение: последнее. Помните: это всего лишь метод Ruby.

person apneadiving    schedule 29.10.2011
comment
есть ли способ указать отдельное изображение по умолчанию для каждой версии? - person user1009762; 30.10.2011
comment
Нет, но это не должно быть проблемой. Просто измените атрибуты html или css соответствующим образом. - person apneadiving; 30.10.2011