Отсутствие неявного преобразования String в Ha sh при загрузке изображения с помощью Carrierwave - PullRequest
2 голосов
/ 06 мая 2020

Я новичок в Carrierwave, и я использую его, чтобы позволить моим пользователям загружать аватар. Я пытался настроить его на использование Fog и Amazon S3. Каждый раз, когда я пытаюсь обновить своего пользователя и передаю новый файл изображения, я получаю ошибку типа, в которой говорится, что он не может преобразовать строку в Ha sh.

error message with params

Инициализатор несущей волны


CarrierWave.configure do |config|
  config.fog_provider = 'fog/aws'
  config.fog_credentials = {
    # Configuration for Amazon S3 should be made available through an Environment variable.
    # For local installations, export the env variable through the shell OR
    # if using Passenger, set an Apache environment variable.
    #
    # In Heroku, follow http://devcenter.heroku.com/articles/config-vars
    #
    # $ heroku config:add S3_KEY=your_s3_access_key S3_SECRET=your_s3_secret S3_REGION=eu-west-1 S3_ASSET_URL=http://assets.example.com/ S3_BUCKET_NAME=s3_bucket/folder

    # Configuration for Amazon S3
    :provider              => 'AWS',
    :aws_access_key_id     => ENV['S3_KEY'],
    :aws_secret_access_key => ENV['S3_SECRET'],
    :region                => ENV['S3_REGION']
  }
  config.fog_directory = ENV['S3_BUCKET_NAME']
  config.fog_public = false
  config.fog_attributes = 

  # For testing, upload files to local `tmp` folder.
  if Rails.env.development?
    config.storage = :file
    config.enable_processing = false
    config.root = "#{Rails.root}/tmp"
  else
    config.storage = :fog
  end

  config.cache_dir = "#{Rails.root}/tmp/uploads"     # To let CarrierWave work on heroku
end

Аватар для загрузки

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

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

  # 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
end

Модель пользователя


  attr_accessor :activation_token, :reset_token, :avatar
  before_save   :downcase_email
  before_create :create_activation_digest
  mount_uploaderuser :avatar, AvatarUploader
  has_secure_password

User # Edit View


<div class="col-sm-6 offset-md-3">
<h2>Edit your profile</h2>

<%= form_for @user, :url => user_url(@user.username), :html => {:multipart => true} do |f| %>
  <div class="form-group">
    <%= f.label :name %>
    <%= f.text_field :name, class: 'form-control' %>
  </div>

  <div class="form-group">
    <%= f.label :email %>
    <%= f.text_field :email, class: 'form-control' %>
  </div>

  <div class="form-group">
    <%= f.label :avatar %>
    <%= f.file_field :avatar, class: 'form-control-file' %>
  </div>

  <div class="form-group">
    <%= f.label :password, "New Password" %>
    <%= f.password_field :password, class: 'form-control' %>
  </div>

  <div class="form-group">
    <%= f.label :password_confirmation, "Confirm New Password" %>
    <%= f.password_field :password_confirmation, class: 'form-control' %>
  </div>

  <%= f.submit 'Update Profile', class: 'btn btn-primary' %>
<% end %>
</div>

Users Controller

  skip_before_action :require_login, :only => [:new, :create]
  before_action :correct_user, only: [:edit, :update]

  def update
    @user = User.find_by_username(params[:username])

    if @user.update_attributes(user_params)
      flash[:success] = "User updated"
      redirect_to user_url(current_user.username)
    else
      render "edit"
    end
  end

  private
    def user_params
      params.require(:user).permit(:name, :username, :email, :password, :password_confirmation, :avatar)
    end

    # Confirms current user
    def correct_user
      @user = User.find_by_username(params[:username])
      if current_user?(@user)
      else
        flash[:danger] = "Can't edit someone else's profile"
        redirect_to user_url(current_user.username)
      end
    end
end

Заранее спасибо за любую помощь, которую вы можете оказать!

1 Ответ

1 голос
/ 06 мая 2020

В этой строке нет ничего после равного ..

config.fog_attributes = 

... так что следующие строки присваиваются config.fog_attributes, что (в стадии разработки) означает, что будет назначена строка "#{Rails.root}/tmp"

Закомментируйте эту строку.

...