ฉันแค่ต้องการนำชิ้นส่วนใหม่มาที่นี่:
ฉันจึงพบวิธีที่ง่ายกว่าเพื่อให้ได้ผลลัพธ์ที่ "AnApprentice" ต้องการ
ก่อนอื่นหากคุณต้องการปรับแต่งอะไรภายในปลั๊กอิน Devise ฉันขอแนะนำให้คุณคัดลอกโค้ดจาก "\ Ruby_repertory \ lib \ ruby \ gems \ 1.9.1 \ gems \ devise-version \ app \ controllers | ผู้ช่วย | จดหมาย ... "ไปยังไฟล์ที่คุณต้องการในโครงการของคุณ
[แก้ไข] หรือคุณสามารถทำให้ไฟล์ของคุณสืบทอดจากไฟล์ "ปกติ" ได้ ... เช่น ... พูดว่า ... คุณต้องการเขียนทับฟังก์ชันเดียวเท่านั้นภายในอุปกรณ์ / registers_controller.rb ซึ่งเป็นบรรทัดแรกของผู้ใช้ของคุณที่กำหนดเอง ตัวควบคุมการลงทะเบียนจะเป็น:
class Users::RegistrationsController < Devise::RegistrationsController
[แก้ไข 7 สิงหาคม 2013] ตอนนี้ Devise ยังมีเครื่องมือในการสร้างคอนโทรลเลอร์: https://github.com/plataformatec/devise/wiki/Tool:-Generate-and-customize-controllers
ดังนั้น ... อย่างไรก็ตาม ... ฉันจัดการเพื่อให้ได้สิ่งที่ "AnApprentice" ต้องการเพียงแค่เขียนสิ่งนี้ (สำหรับวิธีการแก้ปัญหาที่สะอาดกว่าโปรดดูการแก้ไขขนาดใหญ่ต่อไปนี้):
#/my_project/app/helpers/devise_helper.rb
module DeviseHelper
def devise_error_messages!
return "" if resource.errors.empty?
return resource.errors
end
end
และในมุมมองของฉันบรรทัดถัดไปก็ใช้ได้ดี:
<% devise_error_messages!.each do |key, value| %>
<div class="flash <%= key %>"><%= key %> <%= value %></div>
<% end %>
ถ้าอย่างนั้นคุณสามารถเข้าถึงข้อผิดพลาดสำหรับแอตทริบิวต์เฉพาะเช่นนี้:
#Imagine you want only the first error to show up for the login attribute:
<%= devise_error_messages![:login].first %>
และ ... เคล็ดลับเล็ก ๆ น้อย ๆ ที่จะมีข้อผิดพลาดเพียงข้อเดียว (ข้อแรกที่จับได้) ปรากฏขึ้นต่อแอตทริบิวต์:
<% 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 %>
ฉันรู้ว่ามันเป็นเวลานานแล้วที่คำถามนี้ถูกโพสต์ แต่ฉันคิดว่ามันจะช่วยผู้ใช้งานได้มาก :)
แก้ไขใหญ่:
ในขณะที่ฉันชอบที่จะขยายโค้ดของฉันทำให้มันสะอาดขึ้นและแบ่งปันกับคนอื่น ๆ ฉันเพิ่งอยากเปลี่ยน devise_error_messages! วิธีการเพื่อใช้ในมุมมองของฉันและทำให้มันแสดงเคล็ดลับที่ฉันอธิบายไว้ข้างต้น
ดังนั้นนี่คือวิธีการของฉัน:
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
ไม่มีเรื่องใหญ่ที่นี่ฉันใช้รหัสที่เขียนในมุมมองของฉันซ้ำเพื่อแสดงแอตทริบิวต์ pey ข้อผิดพลาดเพียงรายการเดียวเนื่องจากบ่อยครั้งที่อันแรกจะเกี่ยวข้องเพียงช่องเดียว (เช่นเมื่อผู้ใช้ลืมช่องที่จำเป็น)
ฉันกำลังนับข้อผิดพลาด "ที่ไม่ซ้ำกัน" เหล่านั้นและฉันกำลังสร้างชื่อ H2 HTML โดยใช้พหูพจน์และวางไว้ก่อนรายการข้อผิดพลาด
ตอนนี้ฉันสามารถใช้ "devise_error_messages!" เป็นค่าเริ่มต้นและแสดงผลตามที่ฉันเคยแสดงมาก่อนหน้านี้
หากคุณต้องการเข้าถึงข้อความแสดงข้อผิดพลาดเฉพาะในมุมมองของคุณตอนนี้ขอแนะนำให้ใช้ "resource.errors [: attribute] .first" โดยตรงหรืออะไรก็ได้
เซย่า, กุลการ์.