캐리어웨이브를 사용하여 그림을 저장할 때 이름에 id를 사용하지 않는 게 좋을 것 같아요.

5909 단어 Rails

이 기사로 쓰겠습니다.


carrierwave의 이미지 업로드 기능에 저장된 디렉터리, 파일 이름과 연결된 모델의 id를 사용할 때 발생하는 난이도

결론


모든 모델의 주요 열쇠인 id는 임의의 rails로 만든 열로 특별한 의미를 가진다. 만약에 이번에 이미지와 관련된 용도에 좋지 않다면.
유일한 이름을 지으려면 SecureRandom 제작image_path_code 등 열을 사용하고 저장 후 중복 파일 이름을 사용하지 않는다.혹은 자주 만들지 않으면 타임스탬프를 사용하는 방법도 있다.

일어난 일


csv를 통일하여 아래 모델의 데이터를 대량으로 제작하는 기능이 필요하다.
app/model/animal.rb
class Animal < ApplicationRecord
  mount_uploader :animal_icon,              AnimalIconUploader
end
app/uploaders/animal_icon_uploader.rb
class AnimalIconUploader < ApplicationUploader
  def store_dir
    "uploads/images"
  end

  def extension_whitelist
    %w(jpg jpeg png gif)
  end

  def filename
    "animal_img_#{model.id}#{File.extname(original_filename)}" if original_filename.present?
  end
end
csv 제작 데이터 준비
이번에 animals#index 에 대량 등록된 인터페이스를 추가할 것이다.

routing


config/routes.rb
中略
post :animal_bulk_imports, to: 'animals#bulk_import', as: :animal_bulk_imports
中略

view


다음 내용 추가
app/views/animals/index.html.haml
中略

  %section
    .title
      csvから一括で登録する
    = form_tag animal_bulk_imports_path, multipart: true do
     %p
       動物たちのcsvファイル
     = file_field_tag :animal_csv
     = submit_tag 'インポート', class: 'btn btn-default'

中略

controller


app/controllers/animals_controller.rb

class AnimalController < ApplicationController
中略
  def bulk_import
    Animal.bulk_import(params[:animal_csv]) if params[:animal_csv]
    redirect_to animals_path, notice: 'csvによる登録を受け付けました'
  end

  private

  def animal_bulk_import_params
    params.require(:bulk_import_animal).permit(:animal_csv)
  end

中略
end
만약 csv를 통해 그림을 설정하고 저장한다면, 예를 들어
animal = Animal.new
# row['animal_icon_url'] には参照可能なurlが記載されているとする
animal.remote_animal_icon_url = row['animal_icon_url']

animal.save

이미지에 model.id를 사용했기 때문에 제대로 저장할 수 없고 이미지를 등록할 수 없습니다.
이런 일이 일어나다.
이렇게 되면 어떻게 해야 좋은 방법인지 모르겠어요...
기존 데이터를 새로운 참조 목표로 바꾸는 임무를 쓰고 기존 데이터를 옮기면 대응할 수 있습니까?
적어도 앞으로 제작될 응용 프로그램에서 우리는 이미지 경로에 대해 참고하지 않는 것이 가장 좋다는 것을 배웠다model.id.

좋은 웹페이지 즐겨찾기