đường ray - Phát minh - Xử lý - devise_error_messages


125

trong trang chỉnh sửa người dùng của tôi, có một dòng như sau:

<%= devise_error_messages! %>

Vấn đề là điều này không xuất ra lỗi theo cách tiêu chuẩn mà phần còn lại của ứng dụng thực hiện:

<% flash.each do |key, value| %>
    <div class="flash <%= key %>"><%= value %></div>
<% end %>

Câu hỏi của tôi là, làm cách nào để thông báo lỗi phát sinh hoạt động như những người khác sử dụng flash.each?

Cảm ơn.


1
Xin lưu ý rằng Devise đã sử dụng đèn flash như phần còn lại của ứng dụng đang làm. devise_error_messages không phải là về các tin nhắn flash (thông tin từ trang cuối cùng), nhưng thay vì xác nhận sai sót từ ActiveRecord Validation guides.rubyonrails.org/v2.3.11/...
Christopher Oezbek

Câu trả lời:


135

Tôi đang cố gắng để tìm ra điều này bản thân mình. Tôi vừa tìm thấy sự cố này đã đăng nhập trên Github https://github.com/plataformatec/devise/issues/su/504/#comment_574788

Jose đang nói rằng devise_error_messsages!phương thức đó chỉ còn sơ khai (mặc dù nó có chứa triển khai) và chúng ta có nghĩa vụ phải ghi đè / thay thế nó. Sẽ thật tuyệt nếu điều này được chỉ ra ở đâu đó trong wiki, đó là lý do tại sao tôi đoán có một vài người như chúng tôi đã đoán được.

Vì vậy, tôi sẽ thử mở lại mô-đun và xác định lại phương thức, ghi đè hiệu quả thực hiện mặc định. Tôi sẽ cho bạn biết làm thế nào nó đi.

Cập nhật

Đúng, hoạt động. Tôi đã tạo app/helpers/devise_helper.rbvà vượt qua nó như vậy:

module DeviseHelper
  def devise_error_messages!
    'KABOOM!'
  end
end

Vì vậy, biết điều này, tôi có thể sửa đổi phương thức để hiển thị thông báo lỗi theo cách tôi muốn.

Để giúp bạn giải quyết vấn đề ban đầu của mình: Đây là bản gốc devise_helper.rbtrên Github . Hãy xem cách các thông báo lỗi đang được duyệt qua:

messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join

Điều đó sẽ giúp bạn bắt đầu. :)

Một cập nhật khác

Đối resourcetượng thực sự là mô hình đang được sử dụng bởi devise (go hình).

resource.class         #=> User
resource.errors.class  #=> ActiveModel::Error

Nó cũng dường như được xác định trong phạm vi cao hơn (có thể đến từ bộ điều khiển), vì vậy nó có thể được truy cập ở nhiều nơi.

Bất cứ nơi nào trong Người trợ giúp của bạn

module DeviseHelper
  def devise_error_messages1!
    resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
  end

  def devise_error_messages2!
    resource.errors.full_messages.map { |msg| content_tag(:p, msg) }.join
  end
end

Xem của bạn

<div><%= resource.errors.inspect %></div>

Tôi chỉ thử điều này nhưng không được. Mục tiêu là để có được lỗi xuất ra ở đây: <% flash.each do | key, value | %>
AnApprentice

@ColdTree không, mục tiêu là để nó hoạt động như các tin nhắn flash. Có thể kiểm soát đánh dấu là một giải pháp tốt.
Benjamin Atkin

... Tôi không nghĩ điều này trả lời câu hỏi mặc dù đây là một công việc nghiên cứu tốt.
hủy

37

Giải pháp dưới đây hoạt động với phát minh mới nhất tính đến thời điểm hiện tại (4.1.1) và Rails 4.2.6. Nhưng đơn giản đến mức tôi không thấy lý do tại sao nó không hoạt động được 10 năm kể từ bây giờ;)

Nếu bạn muốn tái chế các thông báo lỗi của mình và để chúng trông giống nhau trên ứng dụng của bạn, tôi sẽ đề xuất một cái gì đó như thế này (cách tôi đã học được với Michael Hartl tut):

Tạo một phần cho các thông báo lỗi: layouts/_error_messages.html.erb Đặt bên trong mã sau (ở đây tôi sử dụng một số lớp bootstrap 3):

<% if object.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-danger alert-dismissable">
      <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
      <p><strong>This form contains <%= pluralize(object.errors.count, 'error') %>.</strong></p>
      <ul>
        <% object.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  </div>
<% end %>

Bây giờ bạn có một cái gì đó có thể tái chế và bạn có thể sử dụng nó trên bảng. Thay vì nghĩ ra tiêu chuẩn:

<%= devise_error_messages! %>

Gọi nó dưới dạng của bạn như thế này:

<%= render 'layouts/error_messages', object: resource %>

Bạn có thể đặt nó dưới mọi hình thức. Thay vì chuyển tài nguyên phát minh, bạn có thể chuyển biến từ biểu mẫu của mình như sau:

<%= form_for @post do |f| %>
  <%= render 'layouts/error_messages', object: f.object %>  
  <%= f.text_field :content %>
  <%= f.submit %>
<% end %>

1
Có lẽ là câu trả lời tốt nhất và trực quan nhất bao giờ hết.
Victor

2
Dung dịch mát. số nhiều (object.errors.count, 'lỗi' nên được thay đổi thành số nhiều (object.errors.count, 'error' mặc dù
mizurnix

1
@LukaszMuzyka trong giải pháp này .. tôi có cần xóa không: hợp lệ từ user.rb .. ???
Vishal

1
@Vishal - không. Giải pháp trên chỉ đơn giản là sử dụng HTML khác nhau để hiển thị các thông báo mà nó không thay đổi bất kỳ cơ chế nào của Devise
Lukasz Muzyka

1
@Vishal khi bạn đang sử dụng nghĩ rằng nó đã thực hiện các xác nhận mà bạn đã đề cập mà không cần thêm bất kỳ mã nào. Giải pháp trên chỉ là ghi đè hành vi nghĩ ra mặc định. Bạn phải nghĩ ra việc làm ngay từ đầu. Bạn có chắc chắn nếu bạn đã làm theo hướng dẫn để tích hợp phát triển với dự án của bạn?
Lukasz Muzyka

22

Tôi biết đã được một lúc kể từ khi câu hỏi này được đăng, nhưng tôi chỉ muốn bình luận về những gì tôi đã tìm thấy. Hai người đã trả lời đã giúp tôi rất nhiều và tôi chỉ muốn đóng góp.

Bạn sẽ thấy trong suốt Devise rằng có các cuộc gọi sử dụng render_with_scope. Tôi tin rằng đây là một phương pháp được xác định bởi phát minh và về cơ bản áp dụng phạm vi hiện tại cho chế độ xem tiếp theo được hiển thị.

Tại sao điều này có liên quan? Devise chứa lỗi của bạn trong resource.errors( không @resource.errors ). Devise hoạt động tốt nếu bạn muốn sử dụng nó ra khỏi hộp, có thể nói như vậy.

Các vấn đề với những lỗi này phát sinh nếu bạn bắt đầu thay đổi hành vi quản lý người dùng của mình. Bằng cách thêm một redirect_tohoặc render(thay vì render_with_scope) nơi Devise trước đây không có, bạn về cơ bản sẽ đưa ra các thông báo lỗi. Điều này làm cho Devise không thân thiện để sửa đổi, theo ý kiến ​​của tôi.

Giải pháp của tôi là

# In application.html.erb
<% flash.each do |name, msg| %>

  # New code (allow for flash elements to be arrays)
  <% if msg.class == Array %>
    <% msg.each do |message| %>
      <%= content_tag :div, message, :id => "flash_#{name}" %>
    <% end %>
  <% else %>

    # old code
    <%= content_tag :div, msg, :id => "flash_#{name}" %>

  <% end %> #don't forget the extra end
<% end %>

# Wherever you want Devise's error messages to be handled like 
# your other error messages
# (in my case, registrations_controller.rb, a custom controller)
flash[:notice] = flash[:notice].to_a.concat resource.errors.full_messages

Khối mã sau lấy các thông báo lỗi của Devise dưới dạng một mảng và nối nó vào flash[:notice](dưới dạng một mảng). Mỗi tin nhắn sẽ được in ra một dòng tại một thời điểm. Nếu tôi có thời gian, tôi nghĩ rằng tôi sẽ thay đổi cách Devise xử lý các thông báo lỗi để thực hiện việc này trong ứng dụng của mình, vì có vẻ như sẽ có một hệ thống thông báo lỗi thay vì hai.


3
Cảm ơn bạn rất nhiều vì điều đó, tôi đã đập đầu vào tường vì đã cố gắng làm điều đó.
Lucas

1
Bây giờ là 5 năm sau và phản ứng này đã cứu thịt xông khói của tôi. Cảm ơn rất nhiều @ eric-hu.
marcamillion

12

Tôi đã giải quyết điều này tương tự với YoyoS, bằng cách tạo app/helpers/devise_helper.rbvà đặt nó vào trong đó:

module DeviseHelper

  # Hacky way to translate devise error messages into devise flash error messages
  def devise_error_messages!
    if resource.errors.full_messages.any?
        flash.now[:error] = resource.errors.full_messages.join(' & ')
    end
    return ''
  end
end

Đã làm việc!


11

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.


6

Tôi đang sử dụng Devise trong Rails 3 và mã flash của bạn khá giống với những gì tôi đã có. Trong ứng dụng của tôi, mã hoạt động như mong đợi; tức là thông báo lỗi Devise là đầu ra với phần còn lại của tin nhắn flash của tôi:

<% flash.each do |name, msg| %>
  <%= content_tag :div, msg, :id => "flash_#{name}" if msg.is_a?(String) %>
<% end %>

Hãy thử mã chính xác này và xem liệu nó có khác biệt gì không - thuộc tính ID khác nhau có thể giúp ích.


cảm ơn nhưng cuối cùng không thấy gì "<% = devise_error_messages!%>" xuất hiện lỗi. Ở trên không làm gì? ý tưởng?
AnApprentice

Lời xin lỗi - Tôi chỉ mới thấy bình luận của bạn. Thành thật mà nói, tôi đang cạn kiệt ý tưởng. Tôi giả sử bạn đã xem nguồn trong trình duyệt của mình và kiểm tra HTML được tạo? Chỉ trong trường hợp một cái gì đó bị ẩn bởi CSS. Bạn có đang sử dụng phiên bản mới nhất của Devise 1.1.3 không?
Scott

5

Tôi đã nghĩ ra điều này và nó đã hoạt động cho đến nay. Điều đó thêm các thông điệp phát minh vào đèn flash, vì vậy nó có thể được sử dụng như bình thường. Vui lòng xem xét rằng tôi chưa quen với Ruby và Rails ...

class ApplicationController < ActionController::Base
  after_filter :set_devise_flash_messages, :if => :devise_controller?
  ...

  private:

  def set_devise_flash_messages
    if resource.errors.any?
      flash[:error] = flash[:error].to_a.concat resource.errors.full_messages
      flash[:error].uniq!
    end
  end
end

Biên tập:

Xin lỗi tôi đã chạy bảo vệ và một số hành vi không mong muốn đã có mặt. Vì after_filterđược gọi sau khi kết xuất nên nó không hoạt động như mong đợi. Nếu ai đó biết cách gọi một phương thức sau hành động nhưng trước khi kết xuất ...

Nhưng bạn có thể sử dụng một cái gì đó như thế thay thế:

module ApplicationHelper

  # merge the devise messages with the normal flash messages
  def devise_flash
    if controller.devise_controller? && resource.errors.any?
      flash.now[:error] = flash[:error].to_a.concat resource.errors.full_messages
      flash.now[:error].uniq!
    end
  end

end

Trong views/shared/_messages.html.erb

<% devise_flash %>
<!-- then display your flash messages as before -->

1
+1 Câu trả lời tuyệt vời. Tôi nghĩ rằng đây chắc chắn là giải pháp sạch nhất và phù hợp với kiến ​​trúc hiện tại của tôi. Câu trả lời không quá rõ ràng - về cơ bản mọi thứ trước khi chỉnh sửa nên được bỏ qua (và loại bỏ hoặc đánh qua imo).
zelanix

3

Nếu bạn muốn có thể hiển thị nhiều đèn flash thuộc một loại nhất định (: alert ,: thông báo, v.v.) và không lãng phí thời gian của bạn để cố gắng sửa đổi hành vi đá quý, đây là giải pháp tôi đã sử dụng với Devise. Tôi khá chắc chắn rằng nó có thể được sử dụng với bất kỳ loại đá quý nào sử dụng tin nhắn flash.

Điều đầu tiên cần làm, trong application_controll.rb của bạn, thêm điều này:

  # Adds the posibility to have more than one flash of a given type
  def flash_message(type, text)
    flash[type] ||= []
    flash[type] << text
  end

Điều thứ hai cần làm, hiển thị các tin nhắn flash của bạn với điều này trong application.html.erb (hoặc bất cứ nơi nào bạn muốn):

   <div class="flashes">
      <% flash.each do |key, messages| %>
        <% messages = Array(messages) unless messages.is_a?(Array) %>
        <% messages.each do |message| %>
        <div class="alert alert-<%= key %>">
          <%= message %>
        </div>
        <% end %>
      <% end %>
    </div>

Điều thứ ba cần làm, bất cứ khi nào bạn muốn thêm một tin nhắn flash trong bất kỳ bộ điều khiển nào, hãy làm điều này:

flash_message(:success, "The user XYZ has been created successfully.")

Nhưng làm thế nào để có được các thông báo Devise để gọi flash_messages thay vì giữ một đối tượng lỗi.
Christopher Oezbek

3

Tạo DeviseHelper:

module DeviseHelper
  def devise_error_messages!
    return "" if resource.errors.empty?

    messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg)}.join
    return flash.now[:alert] = messages.html_safe
  end
end

Theo quan điểm của bạn, thay thế

<%= devise_error_messages! %>

Đến:

<% devise_error_messages! %>

1
Trên thực tế, bạn nên sử dụng: flash.now [: alert]
BM

2

Phải thừa nhận rằng, một chút hacky, nhưng tôi đang sử dụng trình trợ giúp này (app / helpers / devise_helper.rb) để lấy flash và sử dụng những cái đó nếu được đặt mặc định resource.errors. Điều này chỉ dựa trên người trợ giúp trong lib dev.

module DeviseHelper

  def devise_error_messages!
    flash_alerts = []
    error_key = 'errors.messages.not_saved'

    if !flash.empty?
      flash_alerts.push(flash[:error]) if flash[:error]
      flash_alerts.push(flash[:alert]) if flash[:alert]
      flash_alerts.push(flash[:notice]) if flash[:notice]
      error_key = 'devise.failure.invalid'
    end

    return "" if resource.errors.empty? && flash_alerts.empty?
    errors = resource.errors.empty? ? flash_alerts : resource.errors.full_messages

    messages = errors.map { |msg| content_tag(:li, msg) }.join
    sentence = I18n.t(error_key, :count    => errors.count,
                                 :resource => resource.class.model_name.human.downcase)

    html = <<-HTML
    <div id="error_explanation">
      <h2>#{sentence}</h2>
      <ul>#{messages}</ul>
    </div>
    HTML

    html.html_safe
  end

end

2

Nếu bạn đang tìm cách cõng devise_error_messages thì bạn có thể làm như vậy bằng cách thêm vào resource.errors

Nếu bạn đã quá lái bộ điều khiển đăng ký, nó có thể trông giống như

def create
  if validation_or_other_check_passes
    super
  else
    build_resource
    clean_up_passwords(resource)
    resource.errors.add(:notice, "The check failed.")
    render :new 

2

Cách rất dễ dàng để hiển thị thông báo lỗi cho từng lĩnh vực

<%= resource.errors.messages[:email].join(" ") %>

đặt cho mỗi trường với tên trường trong dấu ngoặc vuông bên dưới mỗi dòng nơi bạn muốn hiển thị thông báo lỗi nội tuyến.


1

Để hiển thị lỗi phát sinh từ bộ điều khiển của bạn chỉ với lỗi đầu tiên hiển thị.

flash[:error] = @resource.errors.full_messages.first

1

Chỉ cần thêm vào câu trả lời của Eric Hu ở trên, nơi tất cả các câu lệnh If được sử dụng, thay vào đó hãy làm một cái gì đó như thế này.

# Controller
flash.now[:error] = flash[:error].to_a.concat(resource.errors.full_messages)

# View
<% flash.each do |name, msg| %>
 <% Array(msg).uniq.each do |message| %>
  <%= message %>
 <% end %>
<% end %>

1

Tôi chỉ đơn giản làm điều này, làm việc cho tôi: trong ứng dụng / người trợ giúp / , tôi tạo một tệp devise_helper.rb

  module DeviseHelper

  def devise_error_messages_for(resource)
    return "" if resource.errors.empty?

    messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
    sentence = I18n.t("errors.messages.not_saved",
                      count: resource.errors.count,
                      resource: resource.class.model_name.human.downcase)

    html = <<-HTML
    <div id="error_explanation">
      <h2>#{sentence}</h2>
      <ul>#{messages}</ul>
    </div>
    HTML

    html.html_safe
  end
end

trong tất cả các tập tin xem tôi thay đổi

<%= devise_error_messages! %>

cho:

<%= devise_error_messages_for(#your object in your formular)%>

Đối với tôi, nó giúp tôi chỉnh sửa và xem người dùng mới:

  <%=form_for resource, as: @user, url: user_path(@user),...
      <%= devise_error_messages_for(@user) %>

hy vọng nó sẽ giúp bạn;)


Tôi thực sự không hiểu làm thế nào điều này làm bất cứ điều gì? đây là hành vi tiêu chuẩn? Đó chỉ là một cách khác để làm <%= devise_error_messages! %>và không trả lời câu hỏi. Câu hỏi hỏi làm thế nào để áp dụng flash cho mỗi tin nhắn.
Đánh dấu

0
  1. Xóa "devise_error_messages!" từ mẫu "ứng dụng / lượt xem / người dùng / mật khẩu / mới".
  2. Tạo bộ điều khiển tùy chỉnh cho người dùng của bạn (ứng dụng / bộ điều khiển / người dùng / Mật khẩu_controll.rb) và sau bộ lọc thêm lỗi flash mảng:
class Users::PasswordsController < Devise::PasswordsController
  after_filter :flash_errors

  def flash_errors
    unless resource.errors.empty?
      flash[:error] = resource.errors.full_messages.join(", ")
    end
  end
end

0

Tôi thích làm điều đó giống như nó được thực hiện trong bộ điều khiển Devise khác với cheat này.

<% if flash.count > 0 %>
  <div id="error_explanation">
    <h2>Errors prevented you from logging in</h2>
      <ul>
        <% flash.each do |name, msg| %>
        <li>
          <%= content_tag :div, msg, id: "flash_#{name}" %>
        </li>
       <% end %>
     </ul>
   </div>
<% end %>

0

Đối với vật liệu để hiển thị thông báo lỗi phát sinh là bánh mì nướng, tôi đã thêm mã này vào ứng dụng / người trợ giúp / devise_helper.rb

module DeviseHelper
  def devise_error_messages!

    messages = resource.errors.full_messages.map { |msg|
      String.new(" M.toast({html: '" + msg + "' }); ".html_safe )
    }.join

    messages = ("<script>" + messages + "</script>").html_safe
  end 
end

Tôi chắc chắn rằng họ sẽ là cách sạch nhất để viết nó nhưng nó hoàn toàn tỉnh táo


0

DeviseHelper#devise_error_messages! không được chấp nhận và sẽ bị xóa trong phiên bản chính tiếp theo.

Hiện tại, Devise sử dụng một phần bên dưới devise/shared/error_messagesđể hiển thị thông báo lỗi theo mặc định và giúp chúng dễ dàng tùy chỉnh hơn. Cập nhật lượt xem thay đổi cuộc gọi từ:

      <%= devise_error_messages! %>

đến:

      <%= render "devise/shared/error_messages", resource: resource %>

-1

Tôi chỉ tạo một app/helpers/devise_helper.rbJohn giống như nhưng áp đảo phương thức như thế:

module DeviseHelper
  def devise_error_messages!
    flash[:error] = resource.errors.full_messages.join('<br />')
    return ''
  end
end

Với điều này tôi không phải sửa đổi bất cứ điều gì khác. Nó là một ý tưởng tồi ? Tôi mới sử dụng đường ray, đừng ngần ngại sửa lỗi cho tôi. Cảm ơn.


Điều này sẽ không hoạt động như mong muốn, tin nhắn flash hiện chứa thẻ html <br>. Thông thường bạn chỉ đặt chuỗi trong tin nhắn flash của bạn.
AZ.

Có lẽ, nhưng dòng mới vẫn hoạt động. Đề xuất một giải pháp khác nếu bạn không thích giải pháp này.
YoyoS

-2

Tôi vừa tuyên bố devise_error_messages! như một người trợ giúp trống rỗng. Và tìm nạp thủ công và xử lý các lỗi trong một phần _errors chung cho ứng dụng của tôi. Có vẻ như là giải pháp đơn giản nhất và tôi không phải xem qua tất cả các tệp của nhà phát minh và xóa cuộc gọi đến bộ xử lý lỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.