[Rails] 이미지에 대한 여러 개의 투고

입문


이번에 처음으로 설치된 여러 개의 이미지 투고 기능에 대해 자신의 비망록으로 앞으로 설치될 초보자의 참고가 되기를 바랍니다.
(보도 참조)
・refile 기본 및 여러 이미지 업로드
https://qiita.com/nekosuke_/items/501e7ba1b286c51c1be9

개발 환경


ruby 2.6.3
Rails 5.2.4.4

샘플(투고를 위해 업로드된 이미지)


※ 그림 자체에 배경이 없어 이해하기 어려울 수 있습니다.미안합니다.

이번에 사용된 모델


입소문 사이트처럼 점포 정보를 게재하는 것을 목적으로 모델은 샵, Shop Image(그 점포의 복수 초상화를 높이는 것)로 설치되어 있다.
또 점포 정보의 열은 최소한으로 생략된다.
모델 이름
열명
Shop
id
name
caption
모델 이름
열명
Shop_image
id
shop_id
image_id

설치gem


※ refile: 응용 프로그램에 대한 파일 업로드 라이브러리입니다.
※refile-mini_magick: 그림 크기를 조정하는 데 사용됩니다.
Gemfile.
gem "refile", require: "refile/rails", github: 'manfe/refile'
gem "refile-mini_magick"
terminal.
$ bundle install

모델 생성하기


여러 이미지에 새 모델을 생성하여 마이그레이션에 반영합니다.
terminal.
$ rails g model Shop name:string caption:text
$ rails g model ShopImage shop_id:integer image_id:string
$ rails db:migrate
db/schema.rb
ActiveRecord::Schema.define(version: 2021_02_16_101010) do

  create_table "shops", force: :cascade do |t|
    t.string "name", null: false
    t.string "caption", null: false
  end

  create_table "shop_images", force: :cascade do |t|
    t.integer "shop_id", null: false
    t.string "image_id", null: false
  end

end

모델 파일 편집


models/shop.rb
class Shop < ApplicationRecord
  has_many :post_images, dependent: :destroy
  accepts_attachments_for :post_images, attachment: :image
end
models/shop_image.rb
class Post < ApplicationRecord
  belongs_to :shop 
end

컨트롤러 설정


private 아래 매개 변수에 대한 설명에서 여러 이미지의 정보,shop_images_images:[].여러 이미지를 게시할 때는 배열로 전달해야 합니다.→ []
shop.contorller.rb

  def index
    @shop = Shop.all
  end

  def new
    @shop = Shop.new
  end

  def create
    @shop = Shop.new(shop_params)
    @shop.save
  end

  private
  def shop_params
    params.require(:shop).permit(:name, :caption, shop_images_images: [])
  end

보기 만들기


점포 정보를 추가하는 입력표 화면.
여러 이미지의 게시물에 대해 "multiple:true"라는 설명을 추가해야 합니다.
shops/new.html.erb
<%= form_with model: @shop, url: shops_path, local: true do |f| %>
 <%= f.label :"店舗名"%>
 <%= f.text_field :name %>
 <%= f.label :"店舗画像"%>
 <%= f.attachment_field :shop_images_images, multiple: true %>
 <%= f.label :"紹介文"%>
 <%= f.text_area :caption %>
<% end %>
아까도 보충에 기재한 바와 같이 여러 개의 이미지를 배열로 얻어야 하기 때문에 each문에서 모든 점포에서 한 개의 점포 정보를 얻은 다음에 한 개의 점포 정보와 관련된 여러 개의 이미지를 each문으로 배열하여 얻는다.
shops/index.html.erb
<% @shops.each do |shop| %>
 <%= shop.name %>
 <%= shop.caption %>
 <% @shop.shop_images.each do |shop_image| %>
  <%= attachment_image_tag shop_image, :image, size: "130x130" %>
 <% end %>
<% end %>
이 순서에 따라 방금 견본처럼 많이 투고할 수 있다!

끝내다


이번에는 여기까지 하겠습니다.
나 자신도 프로그래밍 초보자이니 같은 입장의 사람에게 참고를 좀 해주면 좋겠다.
또한 내용에 오류가 있으면 지적해 주시기 바랍니다.

좋은 웹페이지 즐겨찾기