[Rails Girls 참가자에게 적합] scaffold가 열명(속성명)을 잘못 만들었을 때의 수정 절차

9512 단어 RailsGirlsRubyRails

개시하다


본고는 Rails Girls 응용 프로그램 자습서scaffold를 만들 때 열 이름 (속성 이름) 을 잘못 입력했을 때의 수정 절차를 소개합니다.
또한 오류가 발견된 시기에 따라 대처 방법이 달라지므로 어느 시기에 적합한지 충분히 유의해야 한다.
코치님이 옆에 계실 때 코치님과 함께 일하세요.

이 보도에서 구상한 잘못에 관하여


이 글에서 잘못된 입력nameneme을 가설했다.
# うっかりnameではなく、nemeと入力してしまった!
rails generate scaffold idea neme:string description:text picture:string
화면에도 "Neme"↓

대상 운영 환경


이 글은 아래의 환경에서 동작 확인을 진행하였다.
  • Rails 5.2.0
  • Ruby 2.5.1
  • macOS 10.13.5
  • 사례 0: 파일을 갑자기 변경할 수 없음


    작업 중에 입력 오류를 발견하면 "큰일났다. 고쳐야 해!"라고 말한다.문건을 갑자기 수정할 수는 없다.
    절차가 매우 섬세하다.
    만약 황급히 파일을 수정하면 다른 파일과 데이터베이스 사이의 일치성을 얻지 못해 시스템 오류가 발생할 수 있다.
    초보자에서 오류가 발생하면 더욱 혼란스러울 수 있으니 코드를 바로 수정하지 말고 다음 절차를 읽어보고 수정하세요.

    사례1:scaffold 제작 후 즉시 의식한 상황(db:migrate가 실행되지 않은 상황)


    터미널에서 다음 명령을 실행하면 이전에 만든 모든 scaffold 관련 파일을 삭제할 수 있습니다.
    rails destroy scaffold idea
    
    명령을 실행하면 다음과 같은 디스플레이가 출력됩니다.
    Running via Spring preloader in process 16335
          invoke  active_record
          remove    db/migrate/20180619000740_create_ideas.rb
          remove    app/models/idea.rb
          invoke    test_unit
          remove      test/models/idea_test.rb
          remove      test/fixtures/ideas.yml
          invoke  resource_route
           route    resources :ideas
          invoke  scaffold_controller
          remove    app/controllers/ideas_controller.rb
          invoke    erb
          remove      app/views/ideas
          remove      app/views/ideas/index.html.erb
          remove      app/views/ideas/edit.html.erb
          remove      app/views/ideas/show.html.erb
          remove      app/views/ideas/new.html.erb
          remove      app/views/ideas/_form.html.erb
          invoke    test_unit
          remove      test/controllers/ideas_controller_test.rb
          remove      test/system/ideas_test.rb
          invoke    helper
          remove      app/helpers/ideas_helper.rb
          invoke      test_unit
          invoke    jbuilder
          remove      app/views/ideas
          remove      app/views/ideas/index.json.jbuilder
          remove      app/views/ideas/show.json.jbuilder
          remove      app/views/ideas/_idea.json.jbuilder
          invoke  assets
          invoke    coffee
          remove      app/assets/javascripts/ideas.coffee
          invoke    scss
          remove      app/assets/stylesheets/ideas.scss
          invoke  scss
    
    파일을 삭제한 후 scaffold를 다시 만듭니다.
    (다음에는 오류를 입력하지 마세요!)
    rails generate scaffold idea name:string description:text picture:string
    
    이후 일반적인 상황에 따라 rails db:migrate 이후의 작업을 진행하세요.

    사례 2: "3. 설계" 작업 도중 발견된 상황


    엄밀히 말하면 rails db:migrate는 집행되었지만 app/models/idea.rbapp/views/ideas/_form.html.erb가 아직 변경되지 않은 상황이 바로 이 상황이다.
    먼저 터미널에서 다음 명령을 실행하여 데이터베이스 수정을 취소합니다.
    rails db:rollback
    
    명령을 실행하면 다음과 같은 디스플레이가 출력됩니다.
    == 20180619002035 CreateIdeas: reverting ======================================
    -- drop_table(:ideas)
       -> 0.0008s
    == 20180619002035 CreateIdeas: reverted (0.0041s) =============================
    
    그리고 scaffold 삭제를 실행합니다. (실행할 때의 출력 예시 생략)
    rails destroy scaffold idea
    
    rails destroy scaffold에서 만든 파일(소스 코드)만 삭제하면 데이터베이스에 추가된 수정(표 작성 등)이 취소되지 않기 때문에 각각 rails db:rollbackrails destroy scaffold idea가 필요하다.
    또한, 실행rails db:rollback에는 파일 마이그레이션db/migrate/20180619000740_create_ideas.rb 등이 필요합니다.
    따라서 rails db:rollbackrails destroy scaffold idea 순서에 따라 명령을 실행해야 한다rails destroy scaffold idea.
    이어서 터미널에서scaffold를 만들고 이전을 실행합니다.
    rails generate scaffold idea name:string description:text picture:string
    
    rails db:migrate
    
    이렇게 수정하면 완성되었을 것이다.
    중간까지 하던 일을 다시 시작하세요.

    팀 개발 시 고려 사항


    Rails Girls 순서대로 개발할 때는 이 정도면 문제없지만, 이게 팀 개발이고 GiitHub으로 코드를 관리하면 후술한'상황3'의 대응이 바람직하다.
    왜 그랬으면 좋겠어요?
    GiitHub에 push가 있는 migration 파일은 쉽게 수정할 수 없습니다. - Qita

    상황 3: "4. 사진 업로드 기능 추가" 이후 발견된 상황


    이미 app/models/idea.rbapp/views/ideas/_form.html.erb를 변경한 경우는 이에 속한다.
    이런 경우 다음과 같은 대체적인 견해에 따라 다음과 같은 절차이다.
  • 열 이름을 변경하는 마이그레이션 수행
  • 소스 코드의 오류 이름을 모두 올바른 이름으로 수정
  • 실제 이동 화면 확인 및 작동
  • 각각 아래에 상세하게 설명하다.

    1. 열 이름을 변경하는 마이그레이션 수행


    터미널에서 다음 명령을 실행합니다.
    rails generate migration RenameNemeToNameInIdeas
    
    rails generate migration (マイグレーション名) 새 마이그레이션 파일을 만들 수 있습니다.RenameNemeToNameInIdeas의 부분은 자유롭게 명명할 수 있다.
    "Ideas의 Neme을 Name으로 이름 바꾸기"라는 뜻으로 "rename neme to name in ideas"라는 이름을 지었습니다.
    위의 명령을 실행하면 다음 출력이 표시됩니다.
    Running via Spring preloader in process 20053
          invoke  active_record
          create    db/migrate/20180619005208_rename_neme_to_name_in_ideas.rb
    
    다음과 같이 텍스트 편집기에서 db/migrate/何らかの数字_rename_neme_to_name_in_ideas.rb를 엽니다.
    db/migrate/어떤 숫자rename_neme_to_name_in_ideas.rb
    class RenameNemeToNameInIdeas < ActiveRecord::Migration[5.2]
      def change
        rename_column :ideas, :neme, :name
      end
    end
    
    db/migrate/ 다음에 만든 파일을 마이그레이션 파일이라고 하는데 데이터베이스를 수정하는 데 사용됩니다.
    여기 rename_column :ideas, :neme, :name의 코드가 쓰여 있습니다.
    이것은'ideas표의 neme열을 name의 명칭으로 바꾸자'는 뜻이다.
    파일을 저장한 후 터미널에서 파일의 내용을 이동합니다.
    rails db:migrate
    
    실행하면 다음 출력이 표시됩니다.
    == 20180619005208 RenameNemeToNameInIdeas: migrating ==========================
    -- rename_column(:ideas, :neme, :name)
       -> 0.0045s
    == 20180619005208 RenameNemeToNameInIdeas: migrated (0.0046s) =================
    
    이렇게 하면 데이터베이스에 있는 열의 이름을 수정할 수 있다.

    2. 소스 코드에서 잘못된 이름을 모두 정확한 이름으로 수정


    다음은 원본 코드에서 잘못된 이름을 모두 정확한 이름으로 수정해야 합니다.
    이 글은'neme'를'name'로 바꿨다.
    또한 대문자와 소문자를 구분해야 하기 때문에'Neme'는 반드시'Name'으로 변경해야 한다.
    터미널에서 다음 명령을 실행하면 원본 코드에서'neme '을 검색할 수 있습니다.
    git add .
    
    git grep neme
    
    다음은 출력 예입니다.
    '파일 경로 (파일이 있는 곳): 검색된 코드가 존재하는 곳' 으로 검색 결과를 표시합니다.
    app/controllers/ideas_controller.rb:      params.require(:idea).permit(:neme, :description, :picture)
    app/views/ideas/_form.html.erb:    <%= form.label :neme %>
    app/views/ideas/_form.html.erb:    <%= form.text_field :neme %>
    app/views/ideas/_idea.json.jbuilder:json.extract! idea, :id, :neme, :description, :picture, :created_at, :updated_at
    app/views/ideas/index.html.erb:        <td><%= idea.neme %></td>
    app/views/ideas/show.html.erb:  <%= @idea.neme %>
    db/migrate/20180619004342_create_ideas.rb:      t.string :neme
    db/migrate/20180619005208_rename_neme_to_name_in_ideas.rb:    rename_column :ideas, :neme, :name
    test/controllers/ideas_controller_test.rb:      post ideas_url, params: { idea: { description: @idea.description, neme: @idea.neme, picture: @idea.picture } }
    test/controllers/ideas_controller_test.rb:    patch idea_url(@idea), params: { idea: { description: @idea.description, neme: @idea.neme, picture: @idea.picture } }
    test/fixtures/ideas.yml:  neme: MyString
    test/fixtures/ideas.yml:  neme: MyString
    test/system/ideas_test.rb:    fill_in "Neme", with: @idea.neme
    test/system/ideas_test.rb:    fill_in "Neme", with: @idea.neme
    
    검색 결과를 닫을 때 q를 입력합니다.
    같은 입력git grep Neme도 대문자'Neme'를 검색해 보세요.
    app/views/ideas/index.html.erb:      <th>Neme</th>
    app/views/ideas/show.html.erb:  <strong>Neme:</strong>
    db/migrate/20180619005208_rename_neme_to_name_in_ideas.rb:class RenameNemeToNameInIdeas < ActiveRecord::Migration[5.2]
    test/system/ideas_test.rb:    fill_in "Neme", with: @idea.neme
    test/system/ideas_test.rb:    fill_in "Neme", with: @idea.neme
    
    그리고 대상의 파일을 열고 하나하나'neme'와'Neme'를 수정하면 OK지만 주의사항이 있다.
    마이그레이션 파일만 특수 파일이므로 수정하지 마십시오.
    위의 실시례에 따르면 다음 두 문건은 이번 대상에 속하지 않는다.
  • db/migrate/20180619004342_create_ideas.rb
  • db/migrate/20180619005208_rename_neme_to_name_in_ideas.rb
  • 이 점을 주의하는 기초 위에서 순서대로 원본 코드를 수정해 주십시오.

    3. 실제 작동 화면 정상 작동 확인


    이런 상황에서 많은 문서가 동시에 수정되어 예상치 못한 곳에서 오류가 발생할 수 있다.
    먼저 화면을 조작해서 프로그램이 정상적으로 작동하는지 확인하세요.
    오류가 발생했을 때는 잘못된 내용을 꼼꼼히 확인하면서 원인을 찾아 수정해 주십시오.
    (단, 잘못된 수정은 초보자에게는 어려울 수 있으니 가능하면 지도교사와 함께 하세요.)

    총결산


    따라서 본고는 Rails Girls 참가자가 scaffold를 제작할 때 열명(속성명)을 잘못 알았을 때의 수정 절차를 설명하고자 한다.
    만약 조심하지 않아 입력이 틀렸다면 이 문장을 참고하여 냉정하게 처리해 주십시오.

    좋은 웹페이지 즐겨찾기