각 양식에 대해 유효성 검증 오류 메시지를 표시하고 싶습니다.

9427 단어 RailsRails4

유효성이 검증된 오류 메시지 표시 정보



보다 간단한 방법 가르쳐 주셨으면 하기 때문에 qiita에 memo로서 올렸습니다.

이런 건 잘 봐

hogehoge.html.haml
= form_for @hogehoge do |f|
    - if @hogehoge.errors.any?
        %ul
          - @hogehoge.errors.full_messages.each do |msg|
            %li= msg

이런 식으로 함께 메시지를 표시합니다.



하지만 ↓처럼 표시하고 싶습니다.


이런 것은 자주 있는 이야기라고 생각해 gem라든지 플러그인으로 해결할 수 있을 것이라고 생각해 가서 봐도 꽤 좋은 정보가 발견되지 않고 곤란하다.

첫 번째 솔루션



@xxxx.errors.messages에서 검색
@xxxx.errors.messages[:zipcode][0]에 오류 메시지가 포함되어 있으므로 표시
 .field
  = f.label :zipcode
  = f.text_field :zipcode
  %p{class: 'error'}[email protected][:zipcode][0]

단점


  • 이것이라면 항목수 많으면 순간에 힘들다.
  • Model에 presence: {message: 'XXXX는 필수 입력입니다'} 등을 써야 한다
  • 무엇보다도 매우 좋지 않은 감에 습격당한다

  • 두 번째 솔루션



    formBuilder 만들기

    참고 : http://mmmpa.hatenablog.com/entry/2015/01/12/Rails_%E3%81%AE_form_for_%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BC% E5%87%BA%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E3%80%81%E3%82%A8%E3%83%A9%E3% 83%BC%E3%81%AF%E3%81%A1%E3%82%83%E3%82%93%E3%81%A8%E3%82%A8

    만마 사용해보기

    builders/with_error_form_builder.rb
    class WithErrorFormBuilder < ActionView::Helpers::FormBuilder
      def pick_errors(attribute)
        return nil if @object.nil? || (messages = @object.errors.messages[attribute]).nil?
        lis = messages.collect do |message|
          %{<li>#{message}</li>}
        end.join
    
        %{<ul class="errors">#{lis}</ul>}.html_safe
      end
    
      def text_field(attribute, options={})
        return super if options[:no_errors]
    
        super + pick_errors(attribute)
      end
    end
    

    이렇게 되었다. 항목명을 내고 싶다・・・.



    @hogehoge.errors.full_messages는 항목 이름 + 오류 내용이므로
    이것을 생성하는 메소드 찾기

    ~/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activemodel-4.2.6/lib/active_model/errors.rb
    # Returns a full message for a given attribute.
    #
    #   person.errors.full_message(:name, 'is invalid') # => "Name is invalid"
    def full_message(attribute, message)
      return message if attribute == :base
      attr_name = attribute.to_s.tr('.', '_').humanize
      attr_name = @base.class.human_attribute_name(attribute, default: attr_name)
      I18n.t(:"errors.format", {
        default:  "%{attribute} %{message}",
        attribute: attr_name,
        message:   message
      })
    end
    

    full_message를 사용하여 메시지를 조립하여 만들었습니다.

    builders/with_errror_form_builder.rb
    class WithErrorFormBuilder < ActionView::Helpers::FormBuilder
    
      def pick_errors(attribute)
        return nil if @object.nil? || (messages = @object.errors.messages[attribute]).nil?
        lis = messages.collect do |message|
          %{<li>#{@object.errors.full_message(attribute, message)}</li>}
        end.join
    
        %{<ul class="errors">#{lis}</ul>}.html_safe
      end
    
      def text_field(attribute, options={})
        return super if options[:no_errors]
    
        super + pick_errors(attribute)
      end
    end
    

    좋은 웹페이지 즐겨찾기