Rails x Bootstrap4 x nested_attributes 양식 디자인 패턴

9886 단어 bootstrap4Rails
  • 자주 사용하기 때문에 메모 쓰기에, 최종적으로 이런 느낌이 됩니다.


  • 완성 후 리포지토리는 여기

  • 설치


  • nested_attributes 의 폼을 만들 때 cocoon 이라는 Gem을 사용하면 편리하기 때문에 그것을 사용합니다.
  • gem 'cocoon'
    
  • cocoon을 사용하려면 Gem을 설치하고 assets/application.js에 등록해야합니다.
  • //= require cocoon
    
  • 나중에 Bootstrap4를 Rails에서 사용하므로 미리 설정해 두십시오. ( 이 기사 이해하기 쉽게 정리했습니다. @ Nakii Shimura 감사합니다.)

  • 모델에 구현


  • 이번은 알기 쉽게 UserDog 를 일대다로 관련짓습니다. ( nested_attributes 잊지 마세요.)
  • 또한 코드를 단순화하기 위해 각 모델의 매개 변수를 배열로 정수화합니다.
  • class User < ApplicationRecord
      ATTRIBUTES = %i[name].freeze
    
      has_many :dogs, dependent: :destroy, inverse_of: :user
      accepts_nested_attributes_for :dogs, allow_destroy: true, reject_if: :all_blank
    end
    
    class Dog < ApplicationRecord
      # nested_attributesの都合上、idと_destroyを加えている。
      ATTRIBUTES = %i[id _destroy name].freeze
    
      belongs_to :user
    end
    

    컨트롤러에 구현


  • nested_attributes 의 StrongParameter의 대응을 잊지 않는다.
  • class UsersController < ApplicationController
      def new
        @user = User.new
      end
    
      def create
        @user = User.new(user_params)
        if @user.save
          redirect_to @user
        else
          render :new
        end
      end
    
      private
    
      def user_params
        params
          .require(:user)
          .permit([*User::ATTRIBUTES, dogs_attributes: Dog::ATTRIBUTES])
      end
    end
    

    뷰 구현


  • 뷰의 구성은 다음과 같습니다. (이번에 사용되는 부분 만)
  • cocoon의 사양으로, 아이 요소의 템플릿이 되는 _〇〇_fields.html.slim 를 만들지 않으면 안 되는 것에 주의해 주세요.
  • cocoon의 뷰 주위의 주의점은 공식 리포지토리 에 정리하고 있으므로, 신경이 쓰이는 분은 확인해 주세요.
  • app/views/users/
    ├── _dog_fields.html.slim
    ├── new.html.slim
    └── show.html.slim
    
  • 실제 코드는 다음과 같습니다.
  • / show.html.slim
    p
      strong Name:
      = @user.name
    
    ul
      - @user.dogs.each do |dog|
        li = dog.name
    
    => link_to 'Edit', edit_user_path(@user)
    '|
    =< link_to 'Back', users_path
    
    / new.html.slim
    h2.py-3 New use
    = form_for @user do |f|
      .form-group.row
        .col-md-3
          = f.label :name
        .col-md-9
          = f.text_field :name, class: 'form-control'
      .form-group.row
        .col-md-3
          = f.label :dogs
        .col-md-9.ml-auto
          #dogList
            = f.fields_for :dogs do |dog|
              = render 'dog_fields', f: dog
          = link_to_add_association f, :dogs, class: "btn btn-link", data: { association_insertion_node: "#dogList", association_insertion_method: "append" } do
            = fa_icon "plus", text: "アイテムを追加"
      = f.submit 'Submit', class: 'btn btn-success w-100'
    
    / _dog_fields.html.slim
    .nested-fields.mb-3
      .form-row
        .col-md-10
          = f.text_field :name, placeholder: '名前', class: 'form-control'
        .col-md-2
          = link_to_remove_association "削除", f, class: "btn btn-danger"
    
  • cocoon의 사양상, nested-fields 클래스를 아이 요소에 붙이지 않으면 추가되지 않습니다.
  • 이것은 "추가 버튼"의 위치를 ​​맨 아래로 유지하면서 새로운 양식을 추가합니다.

  • 요약


  • 이런 느낌으로 만들면 순조롭게 nested_attributes 의 폼 실장을 할 수 있을까 생각합니다!
  • 좋은 웹페이지 즐겨찾기