রেলস - ডিভাইস - হ্যান্ডলিং - ডিভাইস_অরার_মেসেজগুলি


125

আমার ব্যবহারকারীর সম্পাদনা পৃষ্ঠায় নীচে একটি লাইন রয়েছে:

<%= devise_error_messages! %>

সমস্যাটি হ'ল এটি বাকী অ্যাপ্লিকেশনটির মতো স্ট্যান্ডার্ড পদ্ধতিতে ত্রুটি দেয় না:

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

আমার প্রশ্ন হ'ল ফ্ল্যাশ.ইচ ব্যবহার করে এমন অন্যদের মতো কাজ করার জন্য আমি কীভাবে ছল ত্রুটির বার্তা পাব?

ধন্যবাদ।


1
অনুগ্রহ করে নোট করুন যে বাকী অ্যাপ্লিকেশন যেমন করছে ডিভাইস ইতিমধ্যে ফ্ল্যাশটি ব্যবহার করছে। ডিভাইস_রর_মেসেজগুলি ফ্ল্যাশ বার্তাগুলি সম্পর্কে নয় (শেষ পৃষ্ঠার তথ্য), তবে অ্যাক্টিভেকর্ড বৈধকরণ গাইডগুলি
রবিওনরাইলস.

উত্তর:


135

আমি নিজেই এটি বের করার চেষ্টা করছি। আমি সবেমাত্র এই সমস্যাটি গিথুব https://github.com/plataformatec/devise/issues/issue/504/#comment_574788 এ লগইন করেছি

জোস বলছেন যে devise_error_messsages!পদ্ধতিটি কেবল একটি স্টাব (যদিও এটি প্রয়োগ রয়েছে) এবং আমাদের এটির ওভাররাইড / প্রতিস্থাপন করার কথা। এটি যদি উইকির কোথাও চিহ্নিত করা হত, তবে আমার মনে হয় যে আমাদের মতো কয়েক জন লোক অনুমান করছেন।

সুতরাং আমি মডিউলটি পুনরায় খোলার চেষ্টা করব এবং কার্যকরভাবে ডিফল্ট বাস্তবায়নকে ওভাররাইড করে পদ্ধতিটিকে নতুন করে সংজ্ঞায়িত করব। আমি আপনাকে জানাতে পারি যে এটি কীভাবে চলে।

হালনাগাদ

হ্যাঁ, এটি কাজ করে। আমি app/helpers/devise_helper.rbএটিকে এটির মতো তৈরি এবং ওভাররড করেছি:

module DeviseHelper
  def devise_error_messages!
    'KABOOM!'
  end
end

সুতরাং এটি জানার পরে, আমি ত্রুটি বার্তাগুলি যেভাবে চাই তা প্রদর্শন করার পদ্ধতিটি পরিবর্তন করতে পারি।

এখানে মূল: আপনি আপনার মূল সমস্যা সমাধানের জন্য সাহায্য করতে devise_helper.rbGitHub থেকে । ত্রুটি বার্তাগুলি কীভাবে ট্র্যাভারেজ করা হচ্ছে তা একবার দেখুন:

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

এটি আপনাকে শুরু করতে সহায়তা করবে। :)

আরেকটি আপডেট

resourceবস্তু আসলে মডেল যে উইল (যান চিত্রে) দ্বারা ব্যবহৃত হচ্ছে।

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>

আমি এই চেষ্টা করেছি কিন্তু কাজ করে না। লক্ষ্যটি হ'ল ত্রুটিটি এখানে আউটপুট পেতে হবে: <% ফ্ল্যাশ.ইচ ডু | কী, মান | %>
অ্যানপ্রেন্টিস

@ কুলড্রি না, লক্ষ্য এটি ফ্ল্যাশ বার্তাগুলির মতো কাজ করা । মার্কআপ নিয়ন্ত্রণ করতে সক্ষম হওয়াই ভাল সমাধান।
বেনজামিন আতকিন

... আমি মনে করি না যে এটি প্রশ্নের উত্তর দেয় যদিও এটি একটি ভাল গবেষণা কাজ।
ডেভিড

37

নীচে সমাধানটি এখন (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 %>

1
সম্ভবত সেরা এবং সবচেয়ে স্বজ্ঞাত উত্তর।
ভিক্টর

2
শীতল সমাধান। বহুবচনের (অবজেক্ট.অরফারস.কাউন্ট, 'ত্রুটি'গুলি বহুবচনে পরিবর্তন করা উচিত (অবজেক্ট.অরফারসেসকઉન્ટ,' ত্রুটি 'যদিও
মিজার্নিক্স

1
এই সমাধানটিতে লুকাসজ মুজাইকা .. আমাকে কি অপসারণ করতে হবে: ইউজারআরবি থেকে বৈধতাযোগ্য .. ???
বিশাল

1
@ বিশাল - না উপরের সমাধানটিতে ম্যাসেজগুলি প্রদর্শন করতে বিভিন্ন HTML ব্যবহার করা হয় এটি ডিভাইসের কোনও যান্ত্রিক পরিবর্তন করে না
লুকাসজ মুজাইকা

1
@ ভিশাল যখন আপনি কোনও অতিরিক্ত কোড ছাড়াই উল্লিখিত বৈধতাগুলি ইতিমধ্যে কার্যকর করছেন তখন অবিকল ব্যবহার করছেন। উপরের সমাধানটি কেবলমাত্র ডিফল্ট পরিকল্পনার আচরণকে ওভাররাইড করা। আপনাকে প্রথমে কাজ করতে হবে। আপনি কি আপনার প্রকল্পের সাথে পরিকল্পনার সংহতকরণের নির্দেশাবলী অনুসরণ করেছেন কিনা তা নিশ্চিত?
লুকাসজ মুজিকা

22

আমি জানি যে এই প্রশ্নটি পোস্ট হওয়ার পরে একটি সময় হয়েছে, তবে আমি কী খুঁজে পেয়েছি তা সম্পর্কে মন্তব্য করতে চেয়েছিলাম। ইতিমধ্যে জবাব দেওয়া দু'জন ব্যক্তি আমার জন্য এক বিরাট সাহায্য এবং আমি কেবল অবদান রাখতে চেয়েছিলাম।

আপনি ডিভাইস জুড়ে দেখতে পাবেন যে কলগুলি ব্যবহার করছে render_with_scope। আমি বিশ্বাস করি এটি একটি কৌশল যে ছদ্মবেশ দ্বারা সংজ্ঞায়িত করা হয় এবং মূলত রেন্ডার করা পরবর্তী দর্শনে বর্তমান সুযোগটি প্রয়োগ করে।

কেন এটি প্রাসঙ্গিক? নকশায় আপনার ত্রুটি রয়েছে resource.errors( না @resource.errors )। যদি আপনি এটি বাক্সের বাইরে ব্যবহার করতে চান, তবে কথা বলার জন্য ডিভাইসটি দুর্দান্ত কাজ করে।

আপনি যদি নিজের ব্যবহারকারীর পরিচালনার আচরণ পরিবর্তন করতে শুরু করেন তবে এই ত্রুটিগুলির সাথে সমস্যা দেখা দেয়। এমন একটি redirect_toবা render(পরিবর্তে 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](অ্যারে হিসাবে) যুক্ত করে। প্রতিটি বার্তা একবারে এক লাইনে মুদ্রিত হবে। আমার কাছে যদি সময় থাকে তবে আমি মনে করি আমি এটি পরিবর্তন করতে যাচ্ছি ডিভাইস কীভাবে আমার অ্যাপ্লিকেশনটিতে এটি করতে ত্রুটি বার্তাগুলি পরিচালনা করে, কারণ এটি দুটির পরিবর্তে একটি ত্রুটি বার্তা সিস্টেম থাকা আরও পরিষ্কার বলে মনে হয়।


3
আপনাকে এর জন্য অনেক ধন্যবাদ, আমি এটি করার চেষ্টা করার জন্য প্রাচীরের বিরুদ্ধে মাথা ঘুরছিলাম।
লুকাস

1
এটি এখন 5 বছর পরে এবং এই প্রতিক্রিয়াটি আমার বেকনকে বাঁচায়। অনেক ধন্যবাদ @ এরিক-হু
মার্চামিলিয়ন

12

আমি এটি YooS এর সাথে একইভাবে সমাধান করেছি, এটি তৈরি করে এটিতে 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

কাজ করছে!


11

আমি এখানে একটি নতুন ছোট টুকরা আনতে চাই:

সুতরাং ফলাফলটি পাওয়ার একটি সহজ উপায় খুঁজে পেয়েছি যা "অ্যানপ্রেন্টিস" চেয়েছিল।

প্রথমত, আপনি যদি ডিভাইস প্লাগ-ইনটির মধ্যে যে কোনও কিছু কাস্টমাইজ করতে চান তবে আমি আপনাকে "\ রুবি_প্রেরেটরি" লাইব \ রুবি \ রত্নগুলি \ 1.9.1 \ রত্নগুলি ise নকশা-সংস্করণ \ অ্যাপ্লিকেশন \ কন্ট্রোলারগুলি থেকে কোডটি অনুলিপি করতে পরামর্শ দিচ্ছি highly আপনার প্রকল্পে আপনি যে ফাইলটি চান তার জন্য | সহায়তাকারী | মেলার ... "।

[সম্পাদনা] অথবা আপনি নিজের ফাইলটিকে "নরমাল" ডিভাইস ফাইলগুলি থেকে উত্তরাধিকারী করে তুলতে পারেন ... যেমন ... বলুন ... আপনি আপনার ব্যবহারকারীদের কাস্টমের প্রথম লাইনের নকশা / নিবন্ধসমূহ_কন্ট্রোল.আরবি এর মধ্যে কেবল একটি ফাংশন ওভাররাইট করতে চান নিবন্ধগুলি নিয়ন্ত্রক হবেন:

class Users::RegistrationsController < Devise::RegistrationsController

[August ই আগস্ট ২০১৩ সম্পাদনা করুন] এখন ডিভাইস এমনকি কন্ট্রোলার উত্পন্ন করার জন্য একটি সরঞ্জাম সরবরাহ করে: 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 %>

আমি জানি যে এই প্রশ্নটি পোস্ট হওয়ার পরে একটি সময় হয়েছে, তবে আমি মনে করি এটি ব্যবহারকারীর অনেকগুলি ধারণা তৈরি করবে :)।

বড় সম্পাদনা:

যেহেতু আমি আমার কোডটি প্রসারিত করে, এটি আরও পরিষ্কার করে এবং অন্যদের সাথে ভাগ করে নিতে ভালোবাসি, আমি সম্প্রতি ডিভাইস_রর_মেসেজগুলি পরিবর্তন করতে চেয়েছি! এটি আমার দৃষ্টিতে এটি ব্যবহার করার জন্য এবং এটি উপরে বর্ণিত কৌশলটি প্রদর্শন করতে।

সুতরাং, এখানে আমার পদ্ধতি:

 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 এইচটিএমএল শিরোনাম তৈরি করছি এবং ত্রুটি তালিকার আগে এটি রাখছি।

এখন, আমি "ডিভাইস_অরর_মেসেজগুলি" ব্যবহার করতে পারি! ডিফল্ট হিসাবে এবং এটি হুবহু রেন্ডার করে যা আমি ইতিমধ্যে রেন্ডার করেছিলাম।

আপনি যদি নিজের দৃষ্টিতে একটি নির্দিষ্ট ত্রুটি বার্তা অ্যাক্সেস করতে চান তবে আমি এখন সরাসরি "রিসোর্স.অরফারেন্স [: বৈশিষ্ট্য] .প্রথম" বা যে কোনও কিছু ব্যবহার করার পরামর্শ দিচ্ছি।

সেয়া, কুলগার।


6

আমি ডিভাইসগুলিকে রিয়েল 3 ব্যবহার করছি এবং আপনার ফ্ল্যাশ কোডটি আমার কাছে যা পেয়েছে তার থেকে অনেকটা একইরকম। আমার অ্যাপে কোডটি প্রত্যাশার মতো কাজ করে; অর্থাত্ ডিভাইস ত্রুটি বার্তাগুলি আমার বাকী ফ্ল্যাশ বার্তার সাথে আউটপুট:

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

এই সঠিক কোডটি ব্যবহার করে দেখুন এবং এতে কোনও পার্থক্য রয়েছে কিনা তা দেখুন - বিভিন্ন আইডি বৈশিষ্ট্যটি আপনাকে সহায়তা করতে পারে।


ধন্যবাদ তবে এতে কিছুই দেখা যাচ্ছে না। "<% = ডিভাইস_অরার_মেসেজগুলি!%>" একটি ত্রুটি প্রকাশ করে। উপরের কিছুই করেনি? ধারনা?
অ্যানপ্রেন্টিস

ক্ষমা প্রার্থনা - আমি কেবল আপনার মন্তব্যটি দেখেছি honest সত্য কথা বলতে, আমি ধারণার বাইরে চলেছি। আমি ধরে নিয়েছি আপনি আপনার ব্রাউজারে উত্সটি দেখেছেন এবং উত্পন্ন এইচটিএমএলটি পরীক্ষা করেছেন? কিছু ক্ষেত্রে সিএসএস লুকিয়ে রয়েছে। আপনি কি ডিভাইস 1.1.3 এর সর্বশেষতম সংস্করণটি ব্যবহার করছেন?
স্কট

5

আমি এটিতে এসেছি এবং এটি এখন পর্যন্ত কাজ করছে। এটি ফ্ল্যাশটিতে মেসেজগুলি ছড়িয়ে দেয়, তাই এটি যথারীতি ব্যবহার করা যায়। দয়া করে বিবেচনা করুন যে আমি রুবি এবং রেলগুলিতে নতুন ...

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

1
+1 দুর্দান্ত উত্তর। আমি মনে করি এটি অবশ্যই পরিষ্কার সমাধান এবং আমার বর্তমান আর্কিটেকচারের সাথে পুরোপুরি ফিট করে। যদিও উত্তরটি এত পরিষ্কার নয় - মূলত সম্পাদনার আগে সমস্ত কিছু উপেক্ষা করা উচিত (এবং ইমোর মাধ্যমে মুছে ফেলা বা আঘাত করা)।
জেলানিক্স

3

আপনি যদি কোনও প্রদত্ত প্রকারের একাধিক ফ্ল্যাশ (: সতর্কতা,: নোটিশ, ইত্যাদি ...) প্রদর্শন করতে সক্ষম হন এবং কোনও রত্নের আচরণটি সংশোধন করার চেষ্টা করে আপনার সময় নষ্ট না করেন তবে এটিই সমাধান আমি ডিভাইসের সাথে ব্যবহার করেছি। আমি নিশ্চিত যে এটি ফ্ল্যাশ বার্তা ব্যবহার করে এমন কোনও রত্নের সাথে ব্যবহার করা যেতে পারে।

আপনার অ্যাপ্লিকেশন_কন্ট্রোলআরআরবিতে প্রথমে এটি যুক্ত করুন:

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

এটি করার জন্য দ্বিতীয় জিনিস, আপনার অ্যাপ্লিকেশন 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.")

তবে কীভাবে কোনও ত্রুটিযুক্ত বিষয় রাখার পরিবর্তে ফ্ল্যাশ_মেসেজগুলিতে কল করতে ডিভাইস বার্তাগুলি পাবেন।
ক্রিস্টোফার ওয়েজব্যাক 14'15

3

ডিভাইস হেল্পার তৈরি করুন:

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

1
আসলে, আপনার ব্যবহার করা উচিত: ফ্ল্যাশ.নো [: সতর্কতা]
বিএম

2

স্বীকার করে নিন, কিছুটা হ্যাকি, তবে আমি এই হেল্পারটি (অ্যাপ্লিকেশন / সহায়তা / ডিভাইস_হেল্পার.আরবি) ব্যবহার করে ফ্ল্যাশগুলি ধরতে এবং সেগুলি ডিফল্ট হিসাবে সেট করা থাকলে ব্যবহার করতে চাই 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

2

আপনি যদি ডিভাইস_অরর_মেসেজগুলি বন্ধ পিগিব্যাকের দিকে তাকিয়ে থাকেন তবে আপনি রিসোর্স.অরফারেন্স যুক্ত করে এটি করতে পারেন

আপনি যদি নিবন্ধকরণ নিয়ামককে ওভার চালিয়ে যান তবে এটি দেখতে দেখতে বেশ ভালো লাগবে

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

প্রতিটি ক্ষেত্রের জন্য ত্রুটি বার্তা প্রদর্শন করার খুব সহজ উপায়

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

যেখানে আপনি ইনলাইন ত্রুটি বার্তা প্রদর্শন করতে চান সেখানে প্রতিটি লাইনের নীচে বর্গাকার বন্ধনীতে ক্ষেত্রের নাম সহ প্রতিটি ক্ষেত্রের জন্য রাখুন।


1

প্রদর্শিত হওয়াতে কেবল প্রথম ত্রুটি সহ আপনার নিয়ামকটি থেকে আপনার কৌশলটি ত্রুটি দেখানোর জন্য।

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

1

কেবল উপরেরিক হু উত্তর যুক্ত করতে যেখানে সমস্ত বিবৃতি ব্যবহৃত হয়, পরিবর্তে এর মতো কিছু করুন।

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

আশা করি এটা তোমাকে সাহায্য করবে ;)


আমি সত্যিই বুঝতে পারি না কীভাবে এটি কিছু করে? এটা কি স্ট্যান্ডার্ড আচরণ? এটি করার অন্য একটি উপায় <%= devise_error_messages! %>এবং প্রশ্নের উত্তর দেয় না। প্রশ্নটি প্রতিটি বার্তায় কীভাবে ফ্ল্যাশ প্রয়োগ করতে হয় তা জিজ্ঞাসা করে।
চিহ্নিত করুন

0
  1. "ডিভাইস_অরার_মেসেজগুলি" সরান! "অ্যাপ / ভিউ / ব্যবহারকারী / পাসওয়ার্ড / নতুন" টেম্পলেট থেকে।
  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

0

আমি এই চিট দিয়ে অন্য ডিভাইস কন্ট্রোলারে যেমন কাজ করেছি ঠিক তেমনই করতে চাই।

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

টোস্ট হিসাবে তাত্ক্ষণিক বার্তাগুলি প্রদর্শনের জন্য ম্যাটারিয়ালসেসের জন্য আমি এই কোডটি অ্যাপ্লিকেশন / সহায়তা / ডিভাইস_হেল্পার.আরবিতে যুক্ত করেছি

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

আমি নিশ্চিত যে এগুলি লেখার সবচেয়ে সহজ উপায় তবে এটি পুরোপুরি জাগে


0

DeviseHelper#devise_error_messages! অবচয় করা হয়েছে এবং পরবর্তী বড় সংস্করণে সরানো হবে।

ডিভাইসটি devise/shared/error_messagesডিফল্টরূপে ত্রুটি বার্তাগুলি প্রদর্শন করতে এবং সেগুলি কাস্টমাইজ করা সহজ করার জন্য আন্ডার আংশিক ব্যবহার করে । আপনার দৃষ্টিভঙ্গি থেকে কল পরিবর্তন করে আপডেট করুন:

      <%= devise_error_messages! %>

প্রতি:

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

-1

আমি কেবল app/helpers/devise_helper.rbজন এর মতো একটি তৈরি করেছি তবে সেই পদ্ধতিটি ওভাররড করেছি:

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

এটির সাথে আমার আর কিছু সংশোধন করার দরকার নেই। এটা কি খারাপ ধারণা? আমি রেলগুলিতে নতুন, আমাকে সংশোধন করতে দ্বিধা করবেন না। ধন্যবাদ।


এটি পছন্দসই হিসাবে কাজ করবে না ফ্ল্যাশ বার্তায় এখন এইচটিএমএল ট্যাগ রয়েছে <br> সাধারণত আপনি কেবল আপনার ফ্ল্যাশ বার্তায় স্ট্রিং রাখেন।
এজেড

সম্ভবত, তবে নতুন লাইন এখনও কাজ করে। আপনি যদি এটিকে পছন্দ না করেন তবে অন্য একটি সমাধানের প্রস্তাব দিন।
YoyoS

-2

আমি স্রেফ ডিভাইস_অরার_মেসেজগুলি ঘোষণা করেছিলাম! খালি সহায়ক হিসাবে। এবং ম্যানুয়ালি আমার আবেদনের জন্য একটি সাধারণ _ ত্রুটিগুলি আংশিকভাবে ত্রুটিগুলি আনয়ন এবং পরিচালনা করেছে। সহজ সমাধান হিসাবে মনে হয়েছিল এবং আমাকে ত্রুটিযুক্ত ফাইলের সমস্ত ফাইল দিয়ে যেতে হবে না এবং ত্রুটি হ্যান্ডলারের কলটি সরাতে হবে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.