При развертывании приложение Rails сохраняет изображения в новом каталоге релиза capistrano, отличном от текущего выпуска. - PullRequest
0 голосов
/ 29 апреля 2020

то, что происходит с моим приложением rails, очень и очень странно.

Чтобы загрузить картинку, принадлежащую онлайн-статье в моем приложении, я решил использовать carrierwave. Все изображения находятся в удаленном URL-адресе, и для получения изображения и сохранения его на сервере я использую рабочий рельсов

ВЫПУСК

Когда приложение сохраняет новый фид каждый статья (фидлист), принадлежащий этому фиду, сохраняется в postgresql дБ с помощью этого работника (фиды has_many Фидлисты):

class AddNewFeedWorker

  include Sidekiq::Worker

  sidekiq_options :queue => :default
  sidekiq_options :retry => false #when fail don't repeat

.
.
.

def perform(feed_id)  

feed.entries.each do |entry|  

  entry.published.nil? ? @datafeedlist == Time.now() : @datafeedlist = entry.published
  unless Feedlist.where(:guid => entry.id).exists?

  begin
    @object = LinkThumbnailer.generate(entry.url)
    @img_url = @object.images.last.to_s 
  rescue Exception => exc
    logger.error("Message for the log file: #{exc.message} for the feed id: #{@feed.id}")
    @img_url = entry.image
  end 

  sleep 1

  @f = Feedlist.create!(
    :rssurl       => @feed.rssurl,
    :name         => entry.title,
    :summary      => entry.summary,
    :url          => entry.url,    
    :published_at => @datafeedlist,
    :guid         => entry.id,
    :image        => entry.media_thumbnail_url,
    :remote_article_picture_url => @img_url,
    :content      => entry.content,
    :feed_id      => @feed.id,
    :user_id      => @user.id
  )

  end
end

.
.
.

end # end perform method
end # end worker

this line : remote_article_picture_url => @ img_url - это запись несущей, которая извлекает из удаленного местоположения URL-адрес изображения и сохраняет его на вашем сервере.

Я сказал capistrano to сохранять все изображения в общем каталоге для всех выпусков

my_rails_capistrano_directory / shared / uploads

НО приложение, вместо того чтобы сохранять в этом каталоге изображения, создает новый каталог и сохраните все картинки

my_rails_capistrano_directory / Releases / 20200327071103 / uploads

, но мое текущее приложение находится в каталоге текущей версии

my_rails_capistrano_dir ectory / release / 20200429020251

МОЙ ВОПРОС - ПОЧЕМУ ЭТО ПРОИСХОДИТ?

Для получения дополнительной информации вы можете проверить следующий код

CAPISTRANO

config / initializers / carrierwave.rb

CarrierWave.configure do |config|
  config.permissions = 0600
  config.directory_permissions = 0700
  config.storage = :file
  config.root = Rails.root
end

config / deploy.rb

append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "vendor/bundle", "uploads"

UPLOADER (я хочу загрузить в локальной машине. Каталог uploads находится внутри приложения root, но вне / publi c dir)

class CategoryLogoUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  version :middle do
     process resize_to_fit: [400, 300]
  end

  version :thumb do
     process resize_to_fit: [120, 120]
  end

end

MODEL

class Feedlist < ActiveRecord::Base

  mount_uploader :article_picture, CategoryLogoUploader

end

ПРОСМОТР этот код добавляет новый фид, принадлежащий пользователю

<%= form_for([@feed.user, @feed]) do |f| %>
  <% if @feed.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@feed.errors.count, "error") %> prohibited this feed from being saved:</h2>

      <ul>
      <% @feed.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

<div class="form-group">
  <%= I18n.t("feed.title") %> <br />
  <%= f.text_field :title %>
</div> <br />

<div class="form-group">
  <%= I18n.t("feed.insert") %><br />
  <%= f.text_field :rssurl, required: true %>
</div> <br />

<div class="form-group">
  <%= f.hidden_field :user_id, :value => current_user.id %>
</div>

<div class="form-group">
  <%= I18n.t("feed.tags_list") %><br />
  <%= f.text_field :tag_list, required: true %>
</div> 

<div class="form-group">    
  <%= f.submit @feed.new_record? ? "#{I18n.t("feed.insert_button")}" : "#{I18n.t("feed.update_button")}", class: "btn btn-info btn-rounded"%>
</div>

<% end %>

CONTROLLER

def create
  @feed 
  if @feed.save                   
    AddNewFeedWorker.perform_async(@feed.id)                                     
    redirect_to root_path
  else
    render 'new', :notice => "something went wrong"
  end
end

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Я не совсем уверен, но кажется, что приложение не перезапускается после развертывания и все еще находится в 20200327071103 . Вот почему вы загружаете файлы в старый релиз dir.

Еще одна вещь, которую я хотел бы посмотреть, это если ссылки и совпадают с общим каталогом. Например:

 my_rails_capistrano_directory/releases/20200327071103/uploads ->
 my_rails_capistrano_directory/shared/uploads
0 голосов
/ 29 апреля 2020

Вам необходимо настроить config.root для общего каталога.

См. " Невозможно настроить путь хранения с CarrierWave, используя config.root # 2192 ".

...