दिलचस्प पोस्ट
एक चर में संग्रहीत स्ट्रिंग से PHP फ़ंक्शन कैसे कॉल करें जबकि इस पाश के साथ क्या गलत है? क्वेरी स्ट्रिंग पैरामीटर के जावा यूआरएल एन्कोडिंग क्या स्काला वेब-चौखटे उपलब्ध हैं? CSS \ 9 चौड़ाई वाली संपत्ति में स्थैतिक प्रारंभिक ब्लाकों मैं int से स्ट्रिंग कैसे बदलूं? उद्देश्य-सी: श्रेणी में संपत्ति / उदाहरण चर .NET 4.0 में एक नया GAC है, क्यों? खिंचाव के लिए div की चौड़ाई फिट टेक्स्ट JS – setInterval () का उपयोग करने के बाद अंतराल कैसे साफ़ करें पदावनत प्रबंधन () समस्या कैसे PHP त्रुटि को हल करने के लिए 'नोटिस: स्ट्रिंग रूपांतरण में सरणी …' रेगेक्स: मैं यह चाहता हूं कि और वह और … किसी भी क्रम में PHP के साथ आइसो 8601 प्रारूप के रूप में एक दिनांक प्रदर्शित कैसे करें

रेल – डिवाईज – हैंडलिंग – डेविस_रर_सॉसेस

मेरे उपयोगकर्ता के संपादन पेज में, इस प्रकार एक पंक्ति है:

<%= devise_error_messages! %> 

समस्या यह है कि आउटपुट त्रुटियों को मानक तरीके से नहीं किया जाता है जो बाकी का ऐप करता है:

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

मेरा प्रश्न यह है कि मैं फ़्लैश ऑर्डर करने वाले अन्य लोगों की तरह कार्य करने के लिए त्रुटि संदेश कैसे प्राप्त करूं?

धन्यवाद।

वेब के समाधान से एकत्रित समाधान "रेल – डिवाईज – हैंडलिंग – डेविस_रर_सॉसेस"

मैं खुद को समझने की कोशिश कर रहा हूं मुझे सिर्फ यह मुद्दा गिटब https://github.com/plataformatec/devise/issues/issue/504/#comment_574788 पर लॉग इन हुआ

जोस कह रहा है कि devise_error_messsages! विधि सिर्फ एक स्टब है (हालांकि इसमें कार्यान्वयन शामिल है) और हम उसे ओवरराइड / प्रतिस्थापित करना चाहते हैं। यह अच्छा होगा यदि यह विकी में कहीं न कहीं किया गया है, इसलिए मुझे लगता है कि हमारे जैसे कुछ लोग अनुमान लगाते हैं।

इसलिए मैं मॉड्यूल को दोबारा खोलने और विधि को फिर से परिभाषित करने की कोशिश कर रहा हूं, जो मूलभूत क्रियान्वयन को प्रभावी ढंग से ओवरराइड कर रहा है। मैं आपको यह बताता हूं कि यह कैसे जाता है

अद्यतन करें

हां, यह काम करता है मैंने app/helpers/devise_helper.rb और इसे इस तरह app/helpers/devise_helper.rb है:

 module DeviseHelper def devise_error_messages! 'KABOOM!' end end 

तो यह जानकर, मैं त्रुटि संदेश को जिस तरीके से मैं चाहता हूं, उसे प्रदर्शित करने के लिए विधि को संशोधित कर सकता हूं।

अपनी मूल समस्या को सुलझाने में आपकी सहायता के लिए: यहां devise_helper.rb पर मूल devise_helper.rb है । कैसे त्रुटि संदेशों को पार किया जा रहा है पर एक नज़र डालें:

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

यह आपको आरंभ करने में मदद करनी चाहिए। 🙂

एक अन्य अद्यतन

resource ऑब्जेक्ट वास्तव में मॉडल है जिसका उपयोग devise (जा आंकड़े) द्वारा किया जा रहा है।

 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> 

नीचे समाधान नवीनतम (4.1.1) और रेल 4.2.6 के रूप में नवीनतम रूप से काम करता है। लेकिन इतनी सरल है कि मुझे अभी तक 10 साल से काम नहीं करने का कारण नहीं दिख रहा है;)

यदि आप अपने त्रुटि संदेशों को पुनरावृत्ति करना चाहते हैं और उन्हें अपने ऐप पर एक जैसा दिखाना चाहते हैं तो मैं इस तरह से कुछ सुझाऊंगा (जिस तरह से मैंने माइकल हार्टल के साथ सीखा है):

त्रुटि संदेशों के लिए आंशिक बनाएँ: layouts/_error_messages.html.erb निम्नलिखित कोड में डालें (यहां मैं कुछ बूटस्ट्रैप 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 %> 

अब आपके पास कुछ रीसाइक्लेबल है और आप इसे बोर्ड भर में उपयोग कर सकते हैं। मानक योजना के बजाय:

 <%= 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 %> 

मुझे पता है कि यह प्रश्न थोड़ी देर के बाद से पोस्ट किया गया था, लेकिन मैं जो कुछ भी पाया है पर टिप्पणी करना चाहता था। जो दो लोग पहले से ही उत्तर दे चुके हैं, वे मेरे लिए काफी मदद कर रहे थे और मैं सिर्फ योगदान करना चाहता था।

आप पूरे उपकरण में देखेंगे कि render_with_scope का उपयोग कर कॉल कर रहे हैं। मेरा मानना ​​है कि यह एक विधि है जिसकी परिभाषा योजनाबद्ध है और मूल रूप से मौजूदा गुंजाइश को अगले दृश्य पर लागू करती है।

यह क्यों प्रासंगिक है? Devise में resource.errors भीतर अपनी त्रुटियां शामिल हैं। एरर्स ( @resource.errors नहीं । एरर्स) अगर आप इसे बॉक्स से बाहर करना चाहते हैं, तो बोलना ठीक काम करता है।

इन त्रुटियों की समस्याएं उत्पन्न होती हैं यदि आप अपना उपयोगकर्ता प्रबंधन व्यवहार बदलना शुरू करते हैं। एक redirect_torender_with_scope या render (बजाय render_with_scope ) render_with_scope जहां पहले 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 

उत्तरार्द्ध कोड ब्लॉक ऐरीज़ के रूप में डेविस के त्रुटि संदेशों को लेता है और इसे flash[:notice] करने के लिए जोड़ा जाता है flash[:notice] (एक सरणी के रूप में)। प्रत्येक संदेश एक बार में एक पंक्ति को प्रिंट किया जाएगा। अगर मेरे पास समय है, तो मुझे लगता है कि मैं कैसे अपने डिवाइस पर त्रुटि संदेशों को प्रबंधित करने के लिए डिवइज़ को बदलना चाहता हूं, क्योंकि ऐसा लगता है कि दो क्लीनर की बजाय एक त्रुटि संदेश प्रणाली है।

मैं यहां एक नया छोटा टुकड़ा लाने चाहता हूं:

इसलिए मुझे परिणाम प्राप्त करने का एक आसान तरीका मिला है कि "ऐपेंन्टिस" चाहता था

सबसे पहले, यदि आप डेवलवाइस प्लग-इन के भीतर कुछ भी कस्टमाइज़ करना चाहते हैं, तो मैं आपको अत्यधिक सलाह देता हूं कि "\ Ruby_repertory \ lib \ ruby ​​\ gems \ 1.9.1 \ gems \ devise-version \ app \ controllers | हेल्पर्स | मेलर्स … "फाइल में जो आप अपने प्रोजेक्ट में चाहते हैं

[संपादित करें] या आप अपनी फ़ाइल को "सामान्य" फाइलों से प्राप्त कर सकते हैं … जैसे … कहते हैं … आप केवल devise / registrations_controller.rb के भीतर एक ही फ़ंक्शन को ओवरराइट करना चाहते हैं, आपके उपयोगकर्ता कस्टमर की पहली पंक्ति पंजीकरण नियंत्रक होगा:

 class Users::RegistrationsController < Devise::RegistrationsController 

[7 अगस्त 2013 को संपादित करें] अब डिवाईज नियंत्रकों को उत्पन्न करने के लिए एक टूल भी प्रदान करता है: https://github.com/plataformatec/devise/wiki/Tool:- जनरेट करें- और अनुकूलित करें- नियंत्रक

तो … वैसे भी … मैं यह जानने में कामयाब हो गया था कि "ऐपेंन्टिस" सिर्फ यह लिखना चाहता था (क्लीनर समाधान के लिए, निम्न बड़े संपादन देखें):

 #/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 को बदलना चाहता था! विधि यह मेरे विचारों में उपयोग करने के लिए और इसे ऊपर दिखाए गए युगल को प्रदर्शित करने के लिए करते हैं 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 

यहां कोई बड़ी बात नहीं है, मैंने अपने दृश्य में लिखा कोड को फिर से उपयोग किया है जो केवल एक त्रुटि विशेषता को दिखाता है, क्योंकि अक्सर सबसे पहले एक ही प्रासंगिक होता है (जैसे उपयोगकर्ता एक आवश्यक फ़ील्ड भूल जाता है)।

मैं उन "अनूठे" त्रुटियों की गिनती कर रहा हूं और मैं एच 2 एचटीएमएल शीर्षक बना रहा हूं जिससे कि बहुवचन का इस्तेमाल होता है और यह त्रुटियों की सूची से पहले डालती है।

तो अब, मैं "devise_error_messages!" का उपयोग कर सकता हूं डिफ़ॉल्ट एक के रूप में और यह वास्तव में पहले से ही rendering था क्या वास्तव में प्रदान करता है

यदि आप अपने दृश्य में कोई विशिष्ट त्रुटि संदेश एक्सेस करना चाहते हैं, तो अब मैं सीधे "resource.errors [: attribute]। प्रथम" या जो कुछ भी उपयोग करना चाहता हूँ

सीया, कल्गर

मैंने इसे एक app/helpers/devise_helper.rb और इसके में इसे डालकर app/helpers/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 

काम किया!

मैं रेल 3 में डिविज़ का उपयोग कर रहा हूं और आपका फ्लैश कोड मेरे पास क्या है, यह बहुत समान है। मेरे ऐप में, अपेक्षित रूप से कोड काम करता है; यानी डिवइज़ त्रुटि संदेश मेरे फ्लैश संदेशों के बाकी के साथ आउटपुट हैं:

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

यह सटीक कोड आज़माएं और देखें कि यह कोई फर्क नहीं पड़ता है – अलग आईडी विशेषता से मदद मिल सकती है।

मैं इस पर आया और यह अब तक काम कर रहा है। यह फ्लैश में संदेश तैयार करता है, इसलिए इसे सामान्य रूप से इस्तेमाल किया जा सकता है कृपया ध्यान दें कि मैं रूबी और रेल के लिए नया हूँ …

 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 

views/shared/_messages.html.erb

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

यदि आप किसी प्रकार की एक से अधिक फ्लैश प्रदर्शित करने में सक्षम होना चाहते हैं (: अलर्ट, नोटिस, आदि …) और मणि व्यवहार को संशोधित करने का प्रयास करने के लिए अपना समय बर्बाद नहीं करना है, तो यह वह उपाय है जिसे मैं डेवलसे के साथ उपयोग किया था। मुझे पूरा यकीन है कि इसका उपयोग किसी भी मणि के साथ किया जा सकता है जो फ़्लैश संदेश का उपयोग करता है

करने के लिए सबसे पहले, अपने 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.") 

बेशक, एक बिट हैकी, लेकिन मैं फ्लैश को पकड़ने के लिए इस सहायक (ऐप / हेल्पर्स / डेविस_हेल्पर। आरबी) का उपयोग कर रहा हूं और यदि सेट किया जाता है तो resource.errors लिए डिफ़ॉल्ट। एरर्स। यह सिर्फ उस सहायक पर आधारित है जो योजना के मुताबिक उदारीकरण में है।

 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 

प्रत्येक फ़ील्ड के लिए त्रुटि संदेश प्रदर्शित करने का बहुत आसान तरीका

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

हर पंक्ति के नीचे प्रत्येक वर्ग के नीचे फ़ील्ड नाम के साथ प्रत्येक फ़ील्ड के लिए डालें जिसमें आप इनलाइन त्रुटि संदेश प्रदर्शित करना चाहते हैं।

मैं बस ऐसा करता हूं, मेरे लिए काम किया है: ऐप / सहायकों / में , मैं एक फाइल बनाइएविस_हेल्पर.आरबी बनाएँ

  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) %> 

आशा है इससे आपकी मदद होगी 😉

अपने नियंत्रक से दिखाए गए त्रुटि को दिखाने के लिए केवल पहली त्रुटि दिखाने के लिए

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

यदि आप devise_error_messages के बंद piggyback की तलाश कर रहे हैं तो आप resource.errors में जोड़कर ऐसा कर सकते हैं

यदि आप पंजीकरण नियंत्रक की सवारी करते हैं, तो ऐसा लग सकता है

 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 

सिर्फ एरिक हू को ऊपर जोड़ने के लिए जहां सभी बयान उपयोग किए जाते हैं, बजाय इसके बजाय कुछ ऐसा करें।

 # 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. "Devise_error_messages!" निकालें "ऐप / दृश्य / उपयोगकर्ता / पासवर्ड / नया" टेम्पलेट से
  2. अपने उपयोगकर्ता के लिए कस्टम नियंत्रक बनाएं (ऐप / नियंत्रक / उपयोगकर्ता / पासवर्ड_कंट्रोलर। आरबी) और बाद में फ़िल्टर जोड़ त्रुटियों को फ्लैश एरे:
 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 

मुझे ऐसा करना पसंद है जैसे कि यह धोखा देने वाले दूसरे डिवाईज नियंत्रक में किया गया है।

 <% 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 %> 

मैंने बस एक app/helpers/devise_helper.rb को जॉन की तरह app/helpers/devise_helper.rb , लेकिन इस तरह की विधि को ओवरराइड किया है:

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

इसके साथ मुझे और कुछ भी संशोधित करने की आवश्यकता नहीं है I क्या यह एक बुरा विचार है? मैं रेल के लिए नया हूँ, मुझे सही करने में संकोच न करें धन्यवाद।

मैंने सिर्फ devise_error_messages की घोषणा की है! एक खाली सहायक के रूप में और मैन्युअल रूप से मेरे आवेदन के लिए सामान्य _ररर्स आंशिक में त्रुटियों को प्राप्त कर लिया और प्रबंधित किया। सरलतम समाधान की तरह लग रहा था और मुझे सभी उपकरणों के माध्यम से जाना और त्रुटि हैंडलर को कॉल को दूर करने की ज़रूरत नहीं है।