Ruby on Rails
파일 업로드
수색…
Carrierwave를 사용한 단일 파일 업로드
Rails에서 파일 업로드 사용을 시작하는 것은 간단합니다. 먼저 업로드 관리를위한 선택 플러그인이 필요합니다. 가장 보편적 인 것은 Carrierwave 와 Paperclip 입니다. 둘 다 기능면에서 비슷하고에 대한 문서가 풍부합니다.
Carrierwave로 간단한 아바타 업로드 이미지로 예를 들어 보겠습니다.
Carrierwave bundle install
한 후 console에 입력하십시오.
$ rails generate uploader ProfileUploader
이렇게하면 /app/uploaders/profile_uploader.rb 에있는 설정 파일이 생성됩니다.
여기서 저장소 (즉, 로컬 또는 클라우드)를 설정하고, 이미지 조작 (즉, MiniMagick을 통해 엄지 생성)에 대한 확장을 적용하고 서버 측 확장 화이트리스트를 설정할 수 있습니다
다음으로 user_pic에 대한 문자열 tipe로 새 마이그레이션을 만들고 user.rb 모델에 uploader를 마운트합니다.
mount_uploader :user_pic, ProfileUploader
다음으로, 아바타를 업로드 할 양식을 표시합니다 (사용자의 편집보기 일 수 있음).
<% form_for @user, html: { multipart: true } do |f| %>
<%= f.file_field :user_pic, accept: 'image/png, image/jpg' %>
<%= f.submit "update profile pic", class: "btn" %>
<% end %>
양식이 업로드를 처리 할 수 있도록 {multipart : true}를 포함해야합니다. Accept는 클라이언트 측 확장 화이트리스트를 설정하는 선택 사항입니다.
아바타를 표시하려면 간단히
<%= image_tag @user.user_pic.url %>
중첩 된 모델 - 여러 번 업로드
여러 개의 업로드를 만들려면 먼저 새 모델을 만들고 관계를 설정해야합니다.
Product 모델에 대해 여러 이미지가 필요하다고 가정 해 보겠습니다. 새 모델을 만들어 부모 모델에 belongs_to
만듭니다.
rails g model ProductPhoto
#product.rb
has_many :product_photos, dependent: :destroy
accepts_nested_attributes_for :product_photos
#product_photo.rb
belongs_to :product
mount_uploader :image_url, ProductPhotoUploader # make sure to include uploader (Carrierwave example)
accepts_nested_attributes_for 는 중첩 된 양식을 만들 수 있어야하므로 새 파일을 업로드하고 제품 이름을 변경하며 가격을 단일 양식에서 설정할 수 있습니다.
다음으로보기 (편집 / 작성)에서 양식 작성
<%= form_for @product, html: { multipart: true } do |product|%>
<%= product.text_field :price # just normal type of field %>
<%= product.fields_for :product_photos do |photo| # nested fields %>
<%= photo.file_field :image, :multiple => true, name: "product_photos[image_url][]" %>
<% end %>
<%= p.submit "Update", class: "btn" %>
<% end %>
컨트롤러는 특별한 것이 아닙니다. 새 컨트롤러를 만들지 않고 제품 컨트롤러 내에 새 컨트롤러를 만들면됩니다.
# create an action
def upload_file
printer = Product.find_by_id(params[:id])
@product_photo = printer.prodcut_photos.create(photo_params)
end
# strong params
private
def photo_params
params.require(:product_photos).permit(:image)
end
모든 이미지를보기에 표시
<% @product.product_photos.each do |i| %>
<%= image_tag i.image.url, class: 'img-rounded' %>
<% end %>