Rails에서 인증 오류 메시지 분해 시도

7841 단어 RubyRails
이것은 두 번째 투고이다
자신의 재검토로 더 잘 사용하고 싶어요!

이게 뭐야?


저장할 때 잘못된 정보를 표시하는 방법은 없습니다. 조사하면 바로 나오지만 내용에 따라 동작을 바꿀 때 사용합니다.

개발 환경

ruby 2.6.3 Rails 5.2.4.4

작업 준비 1-MVC 기타 제작


콘솔
$ rails new sample_app
$ cd sample_app
$ rails g scaffold post title:string body:text
$ rails db:migrate
이런 느낌으로 나는 title열과 body열이 있는 posts표를 만들었다.

작업 준비 2 - 설정 검증

  • title 공백 불가, 5글자 이내
  • body 공백 불가
  • 사용자 정의 모양새를 정의합니다.
    post.rb
    class Post < ApplicationRecord
      validates :title, presence: true, length: { maximum: 5 }
      validates :body, presence: true
    end
    
    지금

    위에서 설명한 바와 같이 조건이 충족되지 않는 게시물은 저장되지 않습니다.
    그러나 잘못된 정보를 표시하는 보기
    <% @post.errors.full_messages.each do |message| %>
      <li><%= message %></li>
    <% end %>
    
    이렇게 이것을 분해하는 것이 이번 주제다.

    오류 정보 내용


    gempry-byebyg을 사용하여 오류 메시지를 보십시오.(설치 방법 등 할애)
    posts_controller.rb
    
      def create
        @post = Post.new(post_params)
        if @post.save
          redirect_to post_path(@post.id)
        else
          binding.pry #この位置
          render :new
        end
      end
    
    [1] pry(#<PostsController>)> @post.errors.messages
    => {:title=>["is too long (maximum is 5 characters)"], :body=>["can't be blank"]}
    [2] pry(#<PostsController>)> @post.errors.full_messages
    => ["Title is too long (maximum is 5 characters)", "Body can't be blank"]
    
    결과는 이렇다.앞의 보기에서 [2]의 결과 수조가 each를 통해 출력되는 것을 보았습니다.이것을 바탕으로 다양한 시도를 해 보자.

    [1]에서 오류 메시지 변경 시도


    posts_controller.rb
      def create
        @post = Post.new(post_params)
        if @post.save
          redirect_to post_path(@post.id)
        else
          @post.errors.messages[:body] = ["は空欄には出来ません。"] #追加
          render :new
        end
      end
    

    이렇게 해보니까...

    [2]에서 잘못된 정보에 따라 마이그레이션 대상 변경


    posts_controller.rb
      def create
        @post = Post.new(post_params)
        if @post.save
          redirect_to post_path(@post.id)
        else
          if @post.errors.full_messages.any? { |t| "Title can't be blank".include?(t) }
            redirect_to titleblank_path
          elsif @post.errors.full_messages.any? { |t| "Title is too long (maximum is 5 characters)".include?(t) }
            redirect_to titletoolong_path
          else
            redirect_to bodyblank_path
          end
        end
      end
    
    이렇게 설정하면... (라우팅은 별도로 설정됨)

    잘못된 정보에 따라 마이그레이션 목표를 변경할 수도 있습니다.

    끝내다


    나는 많은 것을 남겨두고 자신을 재검토할 수 있는 기회가 됐으면 좋겠다고 생각한다.

    좋은 웹페이지 즐겨찾기