Rails로 기본 정보 기술자 시험의 과거 문제 사이트를 만든다(3:부모와 자식 관계, 등록편)

소개



유루~쿠 배운다. 모두의 웹 공부 커뮤니티. "뉴~부루회"를 운용중입니다.
h tps : // 네 w 부루. 기주 b. 이오/

거기서, 뭔가 교육용의 컨텐츠를 갖고 싶어~라고 생각하고, 이번 기획을 스타트했습니다!

Rails에서 기본 정보 기술자 시험의 과거 문제 사이트를 만듭니다!

최종 목표


  • 문제 및 답변 등록은 Scaffold에서 간단하고 OK
  • API를 준비하고 무작위로 문제를 추출하는 기능을 추가합니다
  • TwitterBOT, LINEBOT, SlackBOT이 가능하면 좋을 것입니다

  • 히스토리



    1: 구축편
    htps : // 코 m / 네 w 부루 / 있어 ms / 에 d59f47 아 c645b19620f6
    2:일본어화(i18n)편
    htps : // 이 m/네 w부루/있어 ms/4f12fdb61bf6cd601545/
    3:부모와 자식 관계, 등록편
     본 페이지
    4:부모와 자식 관계, 참조편
    h tps:// 퀵했다. 작은 m / 네 w 불 / MS / 51b11BD02691 그림 FC2 c0d
    5: API편
    htps : // 코 m / 네 w 부루 / 있어 ms / 89f9f847 아 2648 bd d006c
    6:SlackBOT편
    htps : // 이 m / 네 w 부루 / 있어 ms / 감히 b9 아 cb453이다 786bd59
    7 : Heroku 배포 ~ 자동화 편
    htps : // 이 m / 네 w 부루 / 있어 ms / 0 아 8 ㄴ b02 에 1 8 c8 737 c7

    이번에 할 일


  • 부모 - 자식 관계를 설정하고 등록하기 쉽습니다

  • ※레이아웃을 하려고 생각했습니다만, 이쪽이 우선이므로, 예정을 변경시키고 받았습니다.

    부모와 자식 관계를 설정하고 등록하기 쉽습니다.



    1. gem 'cocoon', gem 'jquery-rails'를 추가합니다.



    Rails5.1에서 jQuery가 사라졌으므로 jquery-rails도 추가해야합니다.

    ./Gemfile
    gem 'cocoon'
    gem 'jquery-rails'
    

    bundle-install
    $ bundle install
    

    2. Model에서 부모-자식 관계를 설정합니다.



    · 부모 (question)에는 "has_many :answers"를 추가합니다.
    ・부모가 삭제되었을 때, 함께 아이도 삭제되도록, 「dependent: :destroy」를 붙입니다.
    · accepts_nested_attributes_for를 사용하면 부모와 자식을 함께 create/update 할 수 있도록 합니다.
    · 삭제할 수 있도록 "allow_destroy: true"를 붙입니다.

    app/models/question.rb
      has_many :answers, dependent: :destroy
      accepts_nested_attributes_for :answers, allow_destroy: true
    

    자식 (models/answer.rb)은 작성시 참조로 사용되므로 자동으로 설정됩니다.

    app/models/answers.rb
      belongs_to :question
    

    3. View에 부모와 자식을 동시에 등록·갱신할 수 있도록 설정합니다.



    application.js에 다음을 추가합니다.

    app/javascripts/application.js
    //= require jquery
    //= require cocoon
    

    view를 변경합니다.

    app/views/questions/_form.html.slim
      .answers
        = f.fields_for :answers do |answer|
          = render 'answer_fields', f: answer
        = link_to_add_association "追加", f, :answers
    

    아이의 정보 등록용 폼이 되는 view 파일을 신규 작성합니다.

    app/views/questions/_answer_fields.html.slim
    .nested-fields
      .field
        = f.label :msg
        = f.text_area :msg
      .field
        = f.label :correct
        = f.check_box :correct
    
      = link_to_remove_association "削除", f
    

    4. 컨트롤러에서 등록 가능하게 합니다.



    아래와 같이 아이의 파라미터를 받을 수 있도록 합시다.

    app/controllers/questions_controller.rb
        def question_params
          params.require(:question).permit(:category1, :category2, :category3, :msg, answers_attributes: [:id, :msg, :correct, :_destroy])
        end
    

    5. 확인합니다.



    신규 작성 화면은 이런 느낌이 됩니다.


    추가 버튼을 누를 때마다 자녀의 입력 영역이 추가됩니다.


    이번에는 여기까지



    고마워요!
    다음 번에는 참조 화면 등에 어린이 정보를 추가하겠습니다.

    좋은 웹페이지 즐겨찾기