[Rails] DB에 데이터가 등록되지 않을 때의 해결 방법

소개



Rails5.0에서의 게시 기능 구현에서는 멈추었으므로 메모

환경



macOS Catalina
Ruby 2.5.1
Rails 5.0.7.2
PostgreSQL

어려움



form_for에서 DB에 데이터를 등록하려고했지만 오류가 발생하지 않았지만 데이터가 저장되지 않았습니다.

해결한 방법


  • GUI 앱에서 확인
  • 저장되지 않는 원인 확인①(pry-rails)
  • 해시의 이중 구조를 해소
  • 보존되지 않는 원인을 확인②(메소드의 뒤에 "!")
  • 밸리데이션에 의한 에러를 해소

  • 1. GUI 앱으로 확인


  • PostgreSQL을 사용하고 있기 때문에 Postico 설치
  • GUI 앱에서 DB를 볼 수있게되면 다시 게시하십시오.
  • GUI 앱에 데이터가 저장되어 있지 않아야합니다.

    ▼설치방법과 DB에 접속하는 방법
    PostgreSQL : PostgreSQL 데이터를 GUI로 만지기(macOS/Postico)
    MySQL : Sequel Pro를 사용하여 데이터베이스를 시각화합시다.

    ▼DB명을 조사하는 방법
    터미널에서 'psql -l' 실행
    실행 결과 "app-name_development"가 대상인 DB 이름

    terminal
    $ psql -l #PostgreSQLのDBを一覧で表示する
    
    #実行結果
                                     List of databases
              Name           | Owner  | Encoding | Collate | Ctype | Access privileges 
    -------------------------+--------+----------+---------+-------+-------------------
     app-name_development    | user   | UTF8     | C       | C     | 
     app-name_test           | user   | UTF8     | C       | C     | 
     postgres                | user   | UTF8     | C       | C     | 
     template0               | user   | UTF8     | C       | C     | =c/user        +
                             |        |          |         |       | user=CTc/user
     template1               | user   | UTF8     | C       | C     | =c/user        +
                             |        |          |         |       | user=CTc/user
    (5 rows)
    

    2. 저장되지 않는 원인을 확인①(pry-rails)


  • pry-rails 설치

  • Gemfile
    group :development, :test do
      gem 'pry-rails'
    end
    

    terminal
    $ bundle install
    
  • 서버 재부팅 (Ctrl + C, rails s)
  • 데이터를 저장하는 메서드에 binding.pry

  • post_controller.rb
    def create
      binding.pry #データを保存するメソッドの中に
      Post.create(post_params)
    end
    
    private
    def post_params
      params.permit(:content, :image)
    end
    
  • 다시 올려주세요.
  • 게시 화면이로드 중이므로 터미널에서 params 확인

  • terminal
        3: def create
     => 4:   binding.pry
        5:   Post.create(post_params)
        6: end
    
    #params と入力
    [1] pry(#<PostsController>)> params
    => <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"zDzgsL3bOIk0QSPOFk7eSOxvqVk18RQ0PW14dC3A7JtsLB9X2pLwvJ41V/f9WeqBDRo4Uz2PKtJDvcT4WpSCRg==", "post"=><ActionController::Parameters {"content"=>"ポストの内容テストテストテスト", "image"=>"test.jpeg"} permitted: false>, "commit"=>"投稿", "controller"=>"posts", "action"=>"create"} permitted: false>
    
    #post_params と入力
    [2] pry(#<PostsController>)> post_params
    Unpermitted parameters: :utf8, :authenticity_token, :post, :commit
    => <ActionController::Parameters {} permitted: true> #ハッシュの中身が空なので登録できていない
    

    해시 인 '{}'의 내용이 비어 있기 때문에,
    params.permit(:content, :image)에서 params에서 해당 키를 검색할 수 없는 이유

    3. 해시의 이중 구조를 해소



    post_controller.rb
    def create
      Post.create(post_params) #binding.pry は削除
    end
    
    private
    def post_params
      params.require(:post).permit(:content, :image)
      #requireメソッドを使って二重構造となっているハッシュを取得
    end
    
  • 다시 게시
  • Postico로 저장되어 있는지 확인 ⇒ 저장되어 있으면 완료!

  • 4. 보존되지 않는 원인을 확인②(메소드 뒤에 "!")


  • 저장되지 않으면 다른 방법으로 원인 확인
  • 저장할 메소드 뒤에!를 붙인다

  • post_controller.rb
    def create
      Post.create!(post_params) #binding.pry は削除 #createの後ろに"!"
    end
    
  • 이 상태에서 다시 투고하면 이미지와 같은 에러가 나올 것 (코드는 다릅니다)


  • ⇒ 어소시에이션이 짜여져 있을 때, 해당 외래 키가 들어 있지 않고, 밸리데이션으로 연주되고 있다

    5. 밸리데이션에 의한 에러를 해소


  • optional : true를 기재

  • post.rb
    class Post < ApplicationRecord
     belongs_to :user, optional: true #optional: ture を記載
    end
    
  • optional : true는 belongs_to의 외래 키 nil을 허용한다.

    Rails의 belongs_to에 지정할 수 있는 optional: true란?
  • 제 경우에는 이것으로 저장할 수 있었습니다.

  • 참고 기사



    htps : // 하고 싶다 l. 코m/쿠에 s치온 s/121213
    htps : // 코 m / 타나카 7014 / MS / 50 A1 A 953b3f440c 481

    좋은 웹페이지 즐겨찾기