[RUBY-ON-RAILS] 레일 - 고안 - 처리 - devise_error_messages을
RUBY-ON-RAILS레일 - 고안 - 처리 - devise_error_messages을
다음과 같이 내 사용자 편집 페이지에서, 라인이있다 :
<%= devise_error_messages! %>
문제는이 응용 프로그램의 나머지를 출력하지 않는 오류가 표준 방법을 수행입니다 :
<% flash.each do |key, value| %>
<div class="flash <%= key %>"><%= value %></div>
<% end %>
어떻게이 flash.each을 사용하여 다른 사람처럼 작동하도록 고안 에러 메시지가 뜹니다되어 내 질문?
감사.
해결법
-
==============================
1.나 자신에서이 문제를 내려고 노력하고있어. 난 그냥 Github에서 로그온이 문제를 발견 https://github.com/plataformatec/devise/issues/issue/504/#comment_574788
나 자신에서이 문제를 내려고 노력하고있어. 난 그냥 Github에서 로그온이 문제를 발견 https://github.com/plataformatec/devise/issues/issue/504/#comment_574788
호세는 devise_error_messsages을 말하고있다! 방법은 단지 그루터기 (이 구현이 포함되어 있지만) 우리가 오버라이드 (override)되어 있다는 것을 / 교체하십시오. 이것은 내가 추측 한 우리와 같은 몇몇 사람들이 생각 왜 위키, 어딘가 지적 된 경우 좋았을 것이다.
내가 효과적으로 기본 구현을 재정의하는 방법을 모듈을 다시 열어 및 재정거야 그래서. 난 당신이 어떻게되는지 알려 드리겠습니다.
그래, 그 작동합니다. 내가 만든 응용 프로그램 / 헬퍼 / devise_helper.rb 및 오버라이드 너무 좋아한다 :
module DeviseHelper def devise_error_messages! 'KABOOM!' end end
이 알고 그래서, 디스플레이 오류 메시지에 내가 원하는 방식으로 방법을 수정할 수 있습니다.
도움말을 당신은 원래 문제를 해결 : 여기 Github에서의 원래 devise_helper.rb입니다. 오류 메시지가 통과되는 방법을 살펴보십시오 :
messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
그것은 당신이 시작하는 데 도움이됩니다. :)
자원 객체는 실제로 유증 (이동 그림)에서 사용하고있는 모델입니다.
resource.class #=> User resource.errors.class #=> ActiveModel::Error
그것은 다양한 장소에 액세스 할 수 있도록 또한, 높은 범위 (아마도 컨트롤러에서 오는)에 정의 된 것으로 보인다.
당신의 도우미 어디서나
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
보기
<div><%= resource.errors.inspect %></div>
-
==============================
2.솔루션 (4.1.1) 지금과 같은 최신 유증으로 작동 4.2.6 레일 아래. 하지만 그것은 지금부터 10 년 작동하지 않을 이유가 표시되지 않도록 간단하다)
솔루션 (4.1.1) 지금과 같은 최신 유증으로 작동 4.2.6 레일 아래. 하지만 그것은 지금부터 10 년 작동하지 않을 이유가 표시되지 않도록 간단하다)
당신이 당신의 오류 메시지를 재활용하고 싶은 경우 그들에게 나는 이런 식으로 뭔가 (내가 마이클 하틀의 혀에 배운 방법)을 추천 할 것입니다 귀하의 응용 프로그램에서 동일한 모양 :
오류 메시지에 대한 부분 만들기 : 코드를 (여기 좀 부트 스트랩 3 개 클래스를 사용) 다음 내부 레이아웃 / _error_messages.html.erb을 넣어 :
<% 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">×</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 %>
지금 당신은 뭔가 재활용이 있고 보드를 통해 사용할 수 있습니다. 대신 표준 유증의 :
<%= devise_error_messages! %>
이 같은 양식에 전화 :
<%= render 'layouts/error_messages', object: resource %>
당신은 어떤 형태로 넣을 수 있습니다. 대신 유증 자원을 전달하는이 같은 폼에서 변수를 전달할 수 있습니다 :
<%= form_for @post do |f| %> <%= render 'layouts/error_messages', object: f.object %> <%= f.text_field :content %> <%= f.submit %> <% end %>
-
==============================
3.나는이 질문이 게시 된 이후 그 동안이었다 알고 있지만 난 그냥 내가 찾은 무엇인지에 대한 언급을 원했다. 이미 대답 한 두 사람은 나에게 엄청난 도움이되었습니다 난 그냥 기여하고 싶었다.
나는이 질문이 게시 된 이후 그 동안이었다 알고 있지만 난 그냥 내가 찾은 무엇인지에 대한 언급을 원했다. 이미 대답 한 두 사람은 나에게 엄청난 도움이되었습니다 난 그냥 기여하고 싶었다.
당신은 with_scope 렌더링 사용하여 통화가 해당 장치를 통해 볼 수 있습니다. 나는이 유증에 의해 정의 된 방법이며 기본적으로 렌더링 된 다음 뷰에 현재 범위를 적용 믿습니다.
왜 이런 일이 관련이? 유증은 resource.errors 내에서 오류를 (하지 resource.errors @)가 포함되어 있습니다. 당신이 상자의 그것을 사용하려는 경우 고안 말하자면, 잘 작동합니다.
당신이 당신의 사용자 관리 동작을 변경 시작하면 이러한 오류 문제가 발생한다. 유증 이전을하지 않은 곳에 redirect_to를 추가하거나 (대신 render_with_scope의) 렌더링하면 기본적으로 오류 메시지를 던지기하고 있습니다. 이것은 내 의견으로는, 수정 궁리가 쌀쌀합니다.
내 솔루션이 있습니다
# 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
후자 코드 블록 배열로 고안의 오류 메시지를 받아이 플래시 추가 [: 예고 (배열로). 각 메시지는 한 번에 하나 개의 라인을 인쇄됩니다. 나는 시간이 있다면, 나는 고안이 내 응용 프로그램을 통해이 작업을 수행하는 오류 메시지를 처리하는 방법을 대신 둘 중 하나 오류 메시지 시스템이 훨씬 청소기를 보인다 변경하는 것 같네요.
-
==============================
4.난 그냥 여기에 새로운 작은 조각을 가지고 싶어 :
난 그냥 여기에 새로운 작은 조각을 가지고 싶어 :
나는 "AnApprentice는"원하는 결과를 얻을 수있는 쉬운 방법을 발견 그래서.
당신이 고안의 내에서 어떤 사용자 정의하려면 먼저, 플러그 - 인, 내가보기 엔 조언 당신은 \ Ruby_repertory \ lib 디렉토리 \ 루비 \ 보석 \ 1.9.1 \ 보석 \ 유증 버전 \ 응용 프로그램 \ 컨트롤러 "의 코드 과거 복사 | 도우미 | 프로젝트에서 원하는 파일에 우편물 ... ".
[편집] 아니면 "정상"유증 파일 ... 같이가 ... 말 ... 당신은 유증 / registrations_controller.rb 내에서 하나 개의 기능, 사용자 정의의 첫 번째 줄을 덮어 쓸지에서 파일 상속을 할 수 있습니다 등록 컨트롤러는 다음과 같습니다
class Users::RegistrationsController < Devise::RegistrationsController
[편집 8 월 7 일 2013] 이제 고안도 컨트롤러를 생성하는 도구를 제공합니다 : 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"를 사용하는 것이 좋습니다.
세야, BULGAR.
-
==============================
5.나는 YoyoS에, 응용 프로그램 / 헬퍼 / devise_helper.rb를 만들고 여기에이를 배치하여 유사하게이 문제를 해결 :
나는 YoyoS에, 응용 프로그램 / 헬퍼 / devise_helper.rb를 만들고 여기에이를 배치하여 유사하게이 문제를 해결 :
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
일했다!
-
==============================
6.나는 레일 3 고안를 사용하고 있는데 플래시 코드는 거의 동일 내가 알아 낸 것입니다. 내 응용 프로그램에서 코드는 예상대로 작동합니다; 즉 유증 오류 메시지가 내 플래시 메시지의 나머지 부분과 출력 :
나는 레일 3 고안를 사용하고 있는데 플래시 코드는 거의 동일 내가 알아 낸 것입니다. 내 응용 프로그램에서 코드는 예상대로 작동합니다; 즉 유증 오류 메시지가 내 플래시 메시지의 나머지 부분과 출력 :
<% flash.each do |name, msg| %> <%= content_tag :div, msg, :id => "flash_#{name}" if msg.is_a?(String) %> <% end %>
이 정확한 코드를 시도하고 어떤 차이가 있는지 - 서로 다른 ID 속성이 도움이 될 수 있습니다.
-
==============================
7.나는이에 와서는 지금까지 일하고있다. 그것은 평소처럼 사용할 수 있도록 즉, 플래시에 유증 메시지를 추가합니다. 내가 루비와 레일스에 새로 온 것을 고려하시기 바랍니다 ...
나는이에 와서는 지금까지 일하고있다. 그것은 평소처럼 사용할 수 있도록 즉, 플래시에 유증 메시지를 추가합니다. 내가 루비와 레일스에 새로 온 것을 고려하시기 바랍니다 ...
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
편집하다:
미안 가드를 실행중인 일부 원치 않는 행동이 존재했다. after_filter이 렌더링 후에 호출되기 때문에 예상대로 작동하지 않도록. 누군가가 방법 조치 후하지만 렌더링하기 전에 호출하는 방법을 알고 있다면 ...
그러나 대신 그런 일을 사용할 수 있습니다 :
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
보기 / 공유 / _messages.html.erb에서
<% devise_flash %> <!-- then display your flash messages as before -->
-
==============================
8.(: 경고 : 통지 등) 주어진 유형의 하나 이상의 플래시를 표시 할 수 있도록하려면 보석 동작을 수정하려고 시간을 낭비하지,이게 내가 고안에 사용되는 솔루션입니다. 나는 그것이 사용 메시지를 플래시 것을 어떤 보석과 함께 사용할 수 있습니다 확신 해요.
(: 경고 : 통지 등) 주어진 유형의 하나 이상의 플래시를 표시 할 수 있도록하려면 보석 동작을 수정하려고 시간을 낭비하지,이게 내가 고안에 사용되는 솔루션입니다. 나는 그것이 사용 메시지를 플래시 것을 어떤 보석과 함께 사용할 수 있습니다 확신 해요.
우선은 할, 당신의 application_controller.rb,이 추가 :
# Adds the posibility to have more than one flash of a given type def flash_message(type, text) flash[type] ||= [] flash[type] << text end
두 번째 문제는, 할 application.html.erb에두고 플래시 메시지를 표시 (또는 당신이 원하는 목적지)합니다 :
<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>
당신은 어떤 컨트롤러 플래시 메시지를 추가 할이 할 때마다 세 번째 것은,해야 할 일 :
flash_message(:success, "The user XYZ has been created successfully.")
-
==============================
9.DeviseHelper 만들기 :
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
보기, 대신에
<%= devise_error_messages! %>
에:
<% devise_error_messages! %>
-
==============================
10.내가 그 설정하면 잡아 깜박이 도우미 (응용 프로그램 / 도우미 / devise_helper.rb)를 사용하고 사용하고 있습니다 만 인정 하듯이, 비트 해키 후 resource.errors 기본값. 이것은 단지 유증의 lib에의 도우미를 기반으로합니다.
내가 그 설정하면 잡아 깜박이 도우미 (응용 프로그램 / 도우미 / devise_helper.rb)를 사용하고 사용하고 있습니다 만 인정 하듯이, 비트 해키 후 resource.errors 기본값. 이것은 단지 유증의 lib에의 도우미를 기반으로합니다.
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
-
==============================
11.당신은 당신이 할 수 있습니다 resource.errors에 추가하여 다음 devise_error_messages의 오프 피기 백을 찾고 있다면
당신은 당신이 할 수 있습니다 resource.errors에 추가하여 다음 devise_error_messages의 오프 피기 백을 찾고 있다면
당신이 이상 등록 컨트롤러를 타고 있다면, 그것은처럼 보일 수 있습니다
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
-
==============================
12.각 필드의 표시 오류 메시지 아주 쉬운 방법
각 필드의 표시 오류 메시지 아주 쉬운 방법
<%= resource.errors.messages[:email].join(" ") %>
유 인라인 오류 메시지를 표시 할 모든 선 아래 각 괄호에 필드 이름과 각 필드에 넣어.
-
==============================
13.나는 단순히 나를 위해 일한이 수행 : 응용 프로그램 / 헬퍼에 / 내가 파일 devise_helper.rb을 만들
나는 단순히 나를 위해 일한이 수행 : 응용 프로그램 / 헬퍼에 / 내가 파일 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
모든보기에서 나는 변화를 파일
<%= devise_error_messages! %>
에 대한:
<%= devise_error_messages_for(#your object in your formular)%>
나를 위해 내보기, 편집 및 새로운 사용자에합니다
<%=form_for resource, as: @user, url: user_path(@user),... <%= devise_error_messages_for(@user) %>
당신을 도움이되기를 바랍니다)
-
==============================
14.게재에 첫 번째 오류 컨트롤러로부터 유증 오류를 표시합니다.
게재에 첫 번째 오류 컨트롤러로부터 유증 오류를 표시합니다.
flash[:error] = @resource.errors.full_messages.first
-
==============================
15.그냥 문을 사용하는 경우 모든이 아니라 대신 같은 것을 할 경우 위의 에릭 후 답변에 추가 할 수 있습니다.
그냥 문을 사용하는 경우 모든이 아니라 대신 같은 것을 할 경우 위의 에릭 후 답변에 추가 할 수 있습니다.
# 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 %>
-
==============================
16.
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
-
==============================
17.나는이 사기와 다른 고안 컨트롤러에서 이루어집니다처럼 그것을 할 것을 좋아합니다.
나는이 사기와 다른 고안 컨트롤러에서 이루어집니다처럼 그것을 할 것을 좋아합니다.
<% 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 %>
-
==============================
18.디스플레이 유증 오류 메시지에 materialisecss 위해 나는 애플 리케이션 / 헬퍼 / devise_helper.rb이 코드를 추가 토스트로
디스플레이 유증 오류 메시지에 materialisecss 위해 나는 애플 리케이션 / 헬퍼 / 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
나는 확실히 그것을 작성하는 깨끗한 방법으로 자신의 것입니다 만 완벽하게 워킹 것
-
==============================
19.난 그냥 존과 같은 응용 프로그램 / 헬퍼 / devise_helper.rb을 만들었지 만 그런 방법을 오버라이드 :
난 그냥 존과 같은 응용 프로그램 / 헬퍼 / devise_helper.rb을 만들었지 만 그런 방법을 오버라이드 :
module DeviseHelper def devise_error_messages! flash[:error] = resource.errors.full_messages.join('<br />') return '' end end
이것으로 내가 무엇을 수정할 필요가 없습니다. 그것은 나쁜 생각인가? 나는 레일에 새로운 해요, 저를 해결하는 데 주저하지 않는다. 감사.
-
==============================
20.난 그냥 devise_error_messages 선언! 빈 도우미로. 그리고 수동으로 가져와 내 응용 프로그램에 대한 부분 일반 _errors에서 오류를 처리. 가장 간단한 해결책처럼 보였다 나는 유증의 모든 파일을 이동하고 오류 처리기에 대한 호출을 제거 할 필요가 없습니다.
난 그냥 devise_error_messages 선언! 빈 도우미로. 그리고 수동으로 가져와 내 응용 프로그램에 대한 부분 일반 _errors에서 오류를 처리. 가장 간단한 해결책처럼 보였다 나는 유증의 모든 파일을 이동하고 오류 처리기에 대한 호출을 제거 할 필요가 없습니다.
from https://stackoverflow.com/questions/4101641/rails-devise-handling-devise-error-messages by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] Heroku가에서 작업을 실행 2.3 스타일의 플러그인과 중단 경고 레일 (0) | 2020.02.04 |
---|---|
[RUBY-ON-RAILS] 루비 온 레일즈는 클래스와 필드를 선택 form_for (0) | 2020.02.04 |
[RUBY-ON-RAILS] 새 응용 프로그램을 만들 때 레일을 버전을 지정하면 사용 (0) | 2020.02.04 |
[RUBY-ON-RAILS] 3.1 자산 파이프 라인을 레일 : 어떻게 부하 컨트롤러 고유의 스크립트에? (0) | 2020.02.04 |
[RUBY-ON-RAILS] 내 레일 응용 프로그램에 대한 사용자 정의 설정 옵션을 만들 수있는 가장 좋은 방법은? (0) | 2020.02.04 |