32

Tôi có các thuộc tính có xác nhận đặc biệt khi tôi sử dụng mệnh đề tin nhắn để hiển thị một thông báo đặc biệt chỉ để xác thực. Dưới đây là một ví dụ:Ruby on Rails i18n - Muốn dịch các tin nhắn tùy chỉnh trong các mẫu

validates :email, presence: true, length: { maximum: 60 }, 
       format:  { with: valid_email_regex, message: "is not a valid email address format." }, 
       uniqueness: { case_sensitive: false } 

Tôi muốn dịch thư ở đây nhưng tôi không chắc chắn cách thực hiện.

Tôi đã xem các ví dụ khi chúng nhập nội dung như sau: message: t ("some_value_here"). Tôi không chắc về tên gọi. Tôi đã thử một cái gì đó như tin nhắn này: t (: bad_email). Tôi đã làm như sau trong tập tin yaml của tôi chỉ để thử một cái gì đó.

activemodel: 
    errors: 
    bad_email: "is not a valid email address format." 

Khi tôi cố gắng truy cập vào ứng dụng Rails của tôi, tôi đã nhận lỗi sau:

ActionView::Template::Error (undefined method `t' for #<Class:0x007fefc1b709e0>) 

Tôi cũng đã cố gắng này trong tập tin yaml tôi:

activemodel: 
    errors: 
    user: 
     bad_email: "is not a valid email address format." 

Tôi đã được nghiên cứu này tắt và cả ngày dài. Tất cả những gì tôi có thể tìm thấy là thay thế các băm lỗi tích hợp như trống hoặc trống. Có cách nào để tôi có băm lỗi tùy chỉnh và thay thế chúng trong mô hình? Tại thời điểm này tôi không thể có được t để làm việc như mã hóa. Hy vọng của tôi là vấn đề là làm thế nào tôi có tập tin yaml của tôi được thiết lập. Tôi đã thấy các phiên bản khác nhau về cách thiết lập điều này. Tôi không chắc chắn nếu tôi nên đặt điều này dưới activemodel hoặc activerecord. Tôi giả sử activemodel vì đó là nơi thông điệp tùy chỉnh mà tôi muốn dịch.

Mọi trợ giúp sẽ được đánh giá cao. Đây là phần cuối cùng tôi cần tìm hiểu trước khi phát hành bản dịch đầu tiên của ứng dụng.

CẬP NHẬT 2013/07/29 19:30 CDT

bgates đã cho tôi một sự khởi đầu rất tốt với làm thế nào để cài đặt tập tin mô hình của tôi để nhận được thông báo tùy chỉnh trong file YAML. Tuy nhiên tôi đã phải thực hiện các thiết lập sau trong tập tin yaml của tôi cho các tin nhắn tùy chỉnh được tìm thấy.

activerecord: 
    errors: 
    models: 
     user: 
     attributes: 
      bio: 
      no_links: "cannot contain email addresses or website links (URLs)." 
      email: 
      bad_email: "is not a valid email address format." 
      username: 
      bad_username: "can only contain numbers and letters. No special characters or spaces." 

Trả lời

63

Sử dụng một biểu tượng cho thông điệp:

validates :email, presence: true, length: { maximum: 60 }, 
      format:  { with: valid_email_regex, message: :bad_email }, 
      uniqueness: { case_sensitive: false } 

sau đó trong tập tin yaml

[lang]: 
    activerecord: 
    errors: 
     messages: 
     bad_email: "just ain't right" 

Nếu có một bản dịch cụ thể để mô hình này, nó sẽ ghi đè lên một chung ở trên:

[lang]: 
    activerecord: 
    errors: 
     models: 
     model_name: # or namespace/model_name 
      attributes: 
      email: 
       bad_email: "model-specific message for invalid email" 

Nếu bạn viết xác nhận tùy chỉnh, add_error(:email, :bad_email) sẽ thực hiện tra cứu ở trên, nhưng errors[:email] << :bad_email sẽ không thực hiện.

+0

tôi thiết lập của tôi mô hình và yaml tập tin. Tôi có một bản dịch bị thiếu cho activerecord.errors.models.user.attributes.email.bad_email. Tôi đặt thay đổi tôi đã thực hiện trong tệp yaml của mình trong mô tả của mình. Nó hoạt động tốt. THANKS SO MUCH CHO GIÚP TÔI BẮT ĐẦU. –

+0

Tôi đã phải sử dụng 'activemodel' thay vì' activerecord' làm khóa cấp cao nhất của tôi. Bạn có thể tìm thêm chi tiết trong phần [Nguồn lỗi] (https://github.com/rails/rails/blob/ccbc98e37dcc11ad5150b93dcee8008bc94aa83a/activemodel/lib/active_model/errors.rb#L465-L472). – Nick

+0

Bí quyết tuyệt vời, cảm ơn bạn –

20

Tôi vừa xem qua tất cả điều này và tìm thấy mã số rails guides for custom validators quá cứng ... Tôi đăng bài này ở đây mặc dù nó không chính xác những gì bạn đã hỏi, nhưng tiêu đề Q phù hợp hoàn hảo (đó là lý do tôi đọc bài đăng này cho vấn đề của tôi).

xác nhận Tuỳ chỉnh với thông điệp i18n:

validate :something_custom?, if: :some_trigger_condition 

def something_custom? 
    if some_error_condition 
    errors.add(:some_field_key, :some_custom_msg) 
    end 
end 

# en.yml 
activerecord: 
    errors: 
    models: 
     some_model: 
     some_custom_msg: "This is i18n controlled. yay!" 
Các vấn đề liên quan