Tôi chỉ muốn mang một mảnh nhỏ mới ở đây:
Vì vậy, tôi đã tìm thấy một cách dễ dàng hơn để có được kết quả mà "AnApprentice" muốn.
Trước hết, nếu bạn muốn tùy chỉnh bất cứ thứ gì trong trình cắm Devise, tôi khuyên bạn nên sao chép mã từ "\ Ruby_Vpertory \ lib \ ruby \ Gem \ 1.9.1 \ Gem \ devise-version \ app \ controls | người trợ giúp | người gửi thư ... "cho tệp bạn muốn trong dự án của bạn.
[Chỉnh sửa] Hoặc bạn có thể làm cho tệp của mình được kế thừa từ các tệp phát minh "bình thường" ... Giống như ... nói ... Bạn muốn ghi đè chỉ một chức năng trong devise / registerations_controll.rb, dòng đầu tiên của tùy chỉnh Người dùng của bạn bộ điều khiển đăng ký sẽ là:
class Users::RegistrationsController < Devise::RegistrationsController
[Chỉnh sửa ngày 7 tháng 8 năm 2013] Bây giờ Devise thậm chí cung cấp một công cụ để tạo bộ điều khiển: https://github.com/plataformatec/devise/wiki/Tool:-Generate-and-customize-controllers
Vì vậy, ... dù sao đi nữa ... tôi đã xoay sở để có được thứ "AnApprentice" muốn viết cái này (để có giải pháp sạch hơn, hãy xem bản chỉnh sửa lớn sau đây):
#/my_project/app/helpers/devise_helper.rb
module DeviseHelper
def devise_error_messages!
return "" if resource.errors.empty?
return resource.errors
end
end
Và, theo quan điểm của tôi, các dòng tiếp theo hoạt động khá tốt:
<% devise_error_messages!.each do |key, value| %>
<div class="flash <%= key %>"><%= key %> <%= value %></div>
<% end %>
Chà ... sau đó bạn có thể truy cập vào các lỗi cho một thuộc tính cụ thể như thế này:
#Imagine you want only the first error to show up for the login attribute:
<%= devise_error_messages![:login].first %>
Và ... Một mẹo nhỏ để chỉ có một lỗi (lỗi đầu tiên bị bắt) hiển thị trên mỗi thuộc tính:
<% if resource.errors.any? %>
<% saved_key = "" %>
<% devise_error_messages!.each do |key, value| %>
<% if key != saved_key %>
<div class="flash <%= key %>"><%= key %> <%= value %></div>
<% end %>
<% saved_key = key %>
<% end %>
<% end %>
Tôi biết đã được một lúc kể từ khi câu hỏi này được đăng, nhưng tôi nghĩ rằng nó sẽ giúp ích rất nhiều cho người dùng nghĩ ra :).
Chỉnh sửa lớn:
Vì tôi thích mở rộng mã của mình, làm cho nó sạch hơn và chia sẻ nó với những người khác, gần đây tôi muốn thay đổi devise_error_messages! phương pháp để sử dụng nó trong quan điểm của tôi và làm cho nó hiển thị các mẹo tôi đã giải thích ở trên.
Vì vậy, đây là phương pháp của tôi:
def devise_error_messages!
html = ""
return html if resource.errors.empty?
errors_number = 0
html << "<ul class=\"#{resource_name}_errors_list\">"
saved_key = ""
resource.errors.each do |key, value|
if key != saved_key
html << "<li class=\"#{key} error\"> This #{key} #{value} </li>"
errors_number += 1
end
saved_key = key
end
unsolved_errors = pluralize(errors_number, "unsolved error")
html = "<h2 class=\"#{resource_name}_errors_title\"> You have #{unsolved_errors} </h2>" + html
html << "</ul>"
return html.html_safe
end
Không có vấn đề gì lớn ở đây, tôi đã sử dụng lại mã mà tôi đã viết theo quan điểm của mình để chỉ hiển thị một thuộc tính pey lỗi, vì thường thì thuộc tính đầu tiên là duy nhất có liên quan (như khi người dùng quên một trường bắt buộc).
Tôi đang đếm những lỗi "duy nhất" đó và tôi đang tạo một tiêu đề H2 HTML bằng cách sử dụng số nhiều và đặt nó TRƯỚC danh sách lỗi.
Vì vậy, bây giờ, tôi có thể sử dụng "devise_error_messages!" như mặc định và nó hiển thị chính xác những gì tôi đã kết xuất trước đó.
Nếu bạn muốn truy cập một thông báo lỗi cụ thể trong chế độ xem của mình, tôi hiện khuyên bạn nên sử dụng trực tiếp "resource.errors [: property] .first" hoặc bất cứ điều gì.
Seya, Kulgar.