수색…


Carrierwave를 사용한 단일 파일 업로드

Rails에서 파일 업로드 사용을 시작하는 것은 간단합니다. 먼저 업로드 관리를위한 선택 플러그인이 필요합니다. 가장 보편적 인 것은 CarrierwavePaperclip 입니다. 둘 다 기능면에서 비슷하고에 대한 문서가 풍부합니다.

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 %>


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow