[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