중간 테이블을 사용하여 태그 기능 (가져오지 않음)

목표


여러 개의 체크 상자를 선택하여 중간 표를 통해 표시 기능을 실현합니다.

개발 환경


・Ruby:2.5.7
・Rails:5.2.4
・Vagrant:2.2.7
가상 상자: 6.1
・OS:macOS Catalina

E-R 그림



상술한 이미지는 이번 설치의 인상이다.
이번에는 제가 설치한 사우나 종류를 여러 개 선택해서 등록한 예로 설명해 주십시오.

사전 준비


초상화 같은 사우나를 새로 만드는 그림이 준비되어 있다.
이번에 사용한 것은 サウナジャンルの複数のチェックボックスを選択して中間テーブルであるサウナジャンルを用いて実装する 방법이다.
등록 기능과 같은 기본 기능은 이미 설치된 것을 전제로 설명한다.

모델에서 연관 설명하기


app/models/sauna.rb
class Sauna < ApplicationRecord
  has_many :sauna_genres, dependent: :destroy
  has_many :genres, through: :sauna_genres
end
app/models/sauna_genre.rb
class SaunaGenre < ApplicationRecord
  belongs_to :genre
  belongs_to :sauna
end
app/models/genre.rb
class Genre < ApplicationRecord
  has_many :sauna_genres
  has_many :saunas, through: :sauna_genres
end

controller


app/controllers/saunas_controller.rb
  def create
    @sauna = Sauna.new(sauna_params)
    @sauna.user_id = current_user.id
    if @sauna.save
      redirect_to user_sauna_path(@sauna)
    else
      render 'new'
    end
  end

 #省略

   def sauna_params
    params.require(:sauna).permit(
      :name,
      genre_ids: []
    )
  end
genre_ids: [] 여러 확인란의 값을 배열을 통해 전달할 수 있습니다.
html.erb
<div>
  <%=f.label :genre_ids, "ジャンル機能" %>
  <span>
    <% Genre.all.each do |genre| %>
      <%= f.check_box :genre_ids, 
         { multiple: true, checked: @sauna.genres.find_by(id: genre.id).present?, 
         include_hidden: false }, genre[:id] %>
       <label class="form-check-label">
         <%= genre.name %>
       </label>
     <% end %>
  </span>
</div>
form.check_box :label_ids→params의 값으로"label_ids"=>["1", "2", "3"]는 이런 형식으로 산열 키가 있는 값을 보낼 수 있다.multiple 옵션은 여러 개의 체크 상자 매개 변수를 그룹으로 보낼 수 있도록 합니다.checked: @task.labels.find_by(id: label.id).present? 화면 편집 등에 등록된 ラベル 에서 검사한 것이다.include_hidden: false → 등록되지 않은 항목에 대해서는 매개 변수를 보내지 않는 방법입니다.
이렇게 설치하면 언뜻 봐도 여러 개의 중간표를 만들 수 있고 편집할 때도 잘 검사해 문제가 없지만 편집 화면에서 검사를 모두 취소하고 업데이트해도 종류의 여러 이름이 사라지지 않는다.
어떤 이유인지,,,, 이 실현 방법은 비어서 보내면 값으로 nil로 되돌아옵니다.
그걸 해결하기 위해서 빨대 파라미터에 공을 들였어요.
app/controllers/saunas_controller.rb
#省略

  def sauna_params
    values = params.require(:sauna).permit(
      :name,
      genre_ids: []
    )
    if values[:genre_ids].nil?
      values[:genre_ids] = [] 
    end
    return values
  end
이렇게 함으로써genre_만약nil이ids로 돌아갈 때 빈 배열을 보내면 종류가 없는 것도 만들 수 있습니다.
종류를 만들었으니 종류가 없을 것 같지만 눈치챘기 때문에 비망록으로 남겼어요.
감사합니다

좋은 웹페이지 즐겨찾기