[ruby-on-rails] Rails의 완벽한 커스텀 유효성 검사 오류 메시지

Rails를 사용하여 저장시 “노래 필드를 비워 둘 수 없습니다”와 같은 오류 메시지가 나타납니다. 다음을 수행하십시오.

validates_presence_of :song_rep_xyz, :message => "can't be empty"

… “Song Rep XYW는 비워 둘 수 없습니다”만 표시됩니다. 필드 제목이 사용자 친화적이지 않기 때문에 좋지 않습니다. 필드 자체의 제목을 어떻게 변경합니까? 데이터베이스에서 필드의 실제 이름을 변경할 수 있지만 여러 “노래”필드가 있으며 특정 필드 이름이 필요합니다.

Rails의 유효성 검사 프로세스를 해킹하고 싶지 않으며 수정 방법이 있어야한다고 생각합니다.



답변

이제 인간화 된 이름과 사용자 정의 오류 메시지를 설정하는 데 허용되는 방법은 로케일사용하는 것 입니다.

# config/locales/en.yml
en:
  activerecord:
    attributes:
      user:
        email: "E-mail address"
    errors:
      models:
        user:
          attributes:
            email:
              blank: "is required"

이제 “이메일”속성에 대한 인간화 된 이름 현재 상태 확인 메시지가 변경되었습니다.

유효성 검사 메시지는 특정 모델 + 속성, 모델, 속성 또는 전체적으로 설정할 수 있습니다.


답변

모델에서 :

validates_presence_of :address1, message: 'Put some address please' 

당신의 관점에서

<% m.errors.each do |attr, msg|  %>
 <%= msg %>
<% end %>

대신에

<%= attr %> <%= msg %>

속성 이름과 함께이 오류 메시지가 나타납니다.

address1 Put some address please

하나의 단일 속성에 대한 오류 메시지를 받으려면

<%= @model.errors[:address1] %>


답변

이 시도.

class User < ActiveRecord::Base
  validate do |user|
    user.errors.add_to_base("Country can't be blank") if user.country_iso.blank?
  end
end

나는 이것을 여기 에서 발견 했다 .

다른 방법이 있습니다. 모델 클래스에서 human_attribute_name 메소드를 정의하면됩니다. 이 메소드는 열 이름을 문자열로 전달하고 유효성 검증 메시지에 사용할 문자열을 리턴합니다.

class User < ActiveRecord::Base

  HUMANIZED_ATTRIBUTES = {
    :email => "E-mail address"
  }

  def self.human_attribute_name(attr)
    HUMANIZED_ATTRIBUTES[attr.to_sym] || super
  end

end

위의 코드는 여기에서


답변

예, 플러그인 없이이 작업을 수행 할 수있는 방법이 있습니다! 그러나 언급 된 플러그인을 사용하는 것만 큼 깨끗하고 우아하지 않습니다. 여기있어.

Rails 3이라고 가정합니다 (이전 버전과 다른지 모르겠습니다).

이것을 모델에 유지하십시오.

validates_presence_of :song_rep_xyz, :message => "can't be empty"

그리고보기에서 떠나지 않고

@instance.errors.full_messages

스캐 폴드 생성기를 사용할 때와 마찬가지로 다음을 입력하십시오.

@instance.errors.first[1]

그리고 속성 이름없이 모델에 지정한 메시지 만받습니다.

설명:

#returns an hash of messages, one element foreach field error, in this particular case would be just one element in the hash:
@instance.errors  # => {:song_rep_xyz=>"can't be empty"}

#this returns the first element of the hash as an array like [:key,"value"]
@instance.errors.first # => [:song_rep_xyz, "can't be empty"]

#by doing the following, you are telling ruby to take just the second element of that array, which is the message.
@instance.errors.first[1]

지금까지 첫 번째 오류에 대해 하나의 메시지 만 표시했습니다. 모든 오류를 표시하려면 해시를 반복하고 값을 표시하십시오.

도움이 되었기를 바랍니다.


답변

완전히 현지화 된 메시지가있는 Rails3 코드 :

user.rb 모델에서 유효성 검사를 정의하십시오.

validates :email, :presence => true

config / locales / en.yml에서

en:
  activerecord:
    models:
      user: "Customer"
    attributes:
      user:
        email: "Email address"
    errors:
      models:
        user:
          attributes:
            email:
              blank: "cannot be empty"


답변

사용자 정의 유효성 검사 방법에서 다음을 사용하십시오.

errors.add(:base, "Custom error message")

add_to_base는 더 이상 사용되지 않습니다.

errors.add_to_base("Custom error message")


답변

허용 된 답변 과 관련이 있으며 다른 답변은 목록에 있습니다 .

nanamkim의 custom-err-msg 포크 가 Rails 5 및 로케일 설정에서 작동 함을 확인하고 있습니다.

캐럿으로 로케일 메시지를 시작하면 메시지에 속성 이름이 표시되지 않아야합니다.

다음과 같이 정의 된 모델 :

class Item < ApplicationRecord
  validates :name, presence: true
end

다음과 같이 en.yml:

en:
  activerecord:
    errors:
      models:
        item:
          attributes:
            name:
              blank: "^You can't create an item without a name."

item.errors.full_messages 표시됩니다 :

You can't create an item without a name

평소 대신 Name You can't create an item without a name