Добавить изображение по умолчанию, если изображение на носителе не загружено - PullRequest
1 голос
/ 08 июня 2019

Я добавляю загрузчик фотографий и хотел бы добавить изображение по умолчанию, если фотография пользователя не загружена? Хотелось бы узнать, что не так с моим утверждением «если».

Я только что вышел из буткемпа кодирования, так что извините код новичка. Заранее извиняюсь за это. Изображение отображается в моей навигационной панели, если я загружаю его, но если я не загружаю его, в моей навигационной панели ничего не будет отображаться.

Это мой файл user.rb

class User < ApplicationRecord
  def set_photo
    if self.photo.nil?
      @photos = ['monsters/1', 'monsters/2', 'monsters/3', 'monsters/4', 'monsters/5', 'monsters/6', 'monsters/7', 'monsters/8']
      self.photo = @photos.sample
      self.save!
    end
  end

Это мой navbar

<% if user_signed_in? %>
  <li class="nav-item dropdown">
    <%= cl_image_tag current_user.photo, class: "avatar dropdown-toggle", id: "navbarDropdown", data: { toggle: "dropdown" }, 'aria-haspopup': true, 'aria-expanded': false %>

Это мой пользовательский контроллер

class UsersController < ApplicationController
  def new
  end

  def show
  end

  def dashboard
    @group = Group.new
    @user_group = UserGroup.new
    @user_groups = current_user.user_groups
    @groups = current_user.groups
    @user = current_user
  end

  def update
    current_user.available_balance += params[:user][:deposit].to_f unless params[:user][:deposit].nil?
    current_user.available_balance -= params[:user][:withdrawal].to_f unless params[:user][:withdrawal].nil?
    current_user.save!
    redirect_to dashboard_path
  end

  private

  def user_params
    params.require(:user).permit(:first_name, :last_name, :photo)
  end
end

Это мой PhotoUploader

class PhotoUploader < CarrierWave::Uploader::Base
  include Cloudinary::CarrierWave
end

Я не получаю никаких сообщений об ошибках, но изображение загружается нормально, и аватар переходит в навигационную панель, но если я не загружаю изображение, то ничего не появляется вообще, и оно не получит изображение по умолчанию «монстр».

1 Ответ

0 голосов
/ 08 июня 2019

Согласно официальной документации перевозчика вы должны предоставить default_url, например:

class MyUploader < CarrierWave::Uploader::Base
  def default_url(*args)
    "/images/fallback/" + [version_name, "default.png"].compact.join('_')
  end
end

Для вашего случая это может выглядеть так:

class PhotoUploader < CarrierWave::Uploader::Base
  def default_url(*args)
    ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
  end
end

После этого вы должны создать папку fallback в папке assets/images и поместить в нее файл default.png.Не забудьте перезапустить приложение.

Кроме того, вы должны смонтировать PhotoUploader на вашей User модели:

class User < ApplicationRecord
  mount_uploader :photo, PhotoUploader
  ...
end

ОБНОВЛЕНИЕ

Я никогда раньше не использовал cloudinary драгоценный камень, но после некоторого поиска я нашел это сообщение в блоге

Из #default_public_id вы должны вернуть публичный идентификатор уже загруженного изображения,например, 'avatar'.

Метод #default_url позволяет указать URL-адрес для использования, полностью пропустив Cloudinary, чтобы вы могли использовать ресурс в своем проекте.

И последнее замечание:когда вы используете изображение в представлении, вы должны вызвать #url в вашей версии, иначе значения по умолчанию не используются.

И пример:

class Client::HeadshotUploader < CarrierWave::Uploader::Base
 include Cloudinary::CarrierWave

 version :circle do
   cloudinary_transformation format: :png, transformation: [
     {effect: :improve},
     {width: 300, height: 300, crop: :thumb, gravity: :face, radius: :max}
   ]
 end

 def default_public_id
   'headshot'
 end
end

, а затем в вашемпросмотр

<%= cl_image_tag client.headshot.circle.url %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...