রেলের সাথে সম্পূর্ণ কাস্টম বৈধতা ত্রুটি বার্তা


260

রেলগুলি ব্যবহার করে আমি সংরক্ষণের সময়ে "গানের ক্ষেত্রটি খালি থাকতে পারে না" এর মতো একটি ত্রুটি বার্তা পাওয়ার চেষ্টা করছি। নিম্নলিখিতগুলি করছেন:

validates_presence_of :song_rep_xyz, :message => "can't be empty"

... কেবল "গানের রেপ এক্সওয়াইডাব্লু খালি থাকতে পারে না" প্রদর্শন করে, যা ক্ষেত্রের শিরোনামটি ব্যবহারকারী বান্ধব নয় বলে ভাল। আমি নিজেই কীভাবে মাঠের শিরোনাম পরিবর্তন করতে পারি? আমি ডাটাবেসে ক্ষেত্রের আসল নামটি পরিবর্তন করতে পারি, তবে আমার একাধিক "গান" ক্ষেত্র রয়েছে এবং আমার নির্দিষ্ট ক্ষেত্রের নাম থাকা দরকার।

আমি রেলের 'বৈধতা প্রক্রিয়াটি ঘুরে দেখতে চাই না এবং আমার মনে হয় এটি ঠিক করার কোনও উপায় থাকা উচিত।

উত্তর:


432

এখন, মানবিক নাম এবং কাস্টম ত্রুটি বার্তা সেট করার স্বীকৃত উপায় হ'ল লোকেল ব্যবহার করা

# config/locales/en.yml
en:
  activerecord:
    attributes:
      user:
        email: "E-mail address"
    errors:
      models:
        user:
          attributes:
            email:
              blank: "is required"

এখন "ইমেল" বৈশিষ্ট্যের জন্য মানবিক নাম এবং উপস্থিতি বৈধতা বার্তা পরিবর্তন করা হয়েছে।

বৈধতা বার্তাগুলি নির্দিষ্ট মডেল + অ্যাট্রিবিউট, মডেল, অ্যাট্রিবিউট বা বিশ্বব্যাপী সেট করা যেতে পারে।


19
আপনি যদি মংগয়েড ব্যবহার করছেন তবে অ্যাক্টিভিরকর্ডটি প্রতিস্থাপন করুন: মঙ্গোড সহ:
ইন্টেন্টস

88
@ গ্রেভো: মন্তব্যে না থাকলে উত্তর সম্পর্কে প্রশ্ন কোথায় পোস্ট করা উচিত? এখানে I18n
টাইলার রিক

4
উপায় দ্বারা: আপনি যদি রেল ৩.১.৩ এ আপনার বৈধকরণকারকের বার্তা প্যারামিটারের জন্য একটি চিহ্ন প্রবেশ করেন, এটি আপনাকে খুঁজে দেবে না এমন সুযোগটি এটি খুঁজে পাবে যা এটি খুঁজে পাওয়া যায় নি, তাই আপনি ঠিক কী কী রাখবেন তা জানেন লোকেল yML।
aceofspades

4
ঠিক আছে, এটি বেশ ভাল এবং সব কিছু, তবে কি যদি নির্লিপ্তভাবে কলামের নামটি প্রবর্তন করা (এটি মানুষের পাঠযোগ্য যেভাবেই হোক না কেন) পুরোপুরি এফ-আপেড ব্যাকরণের দিকে পরিচালিত করবে (বিশেষত অ-ইংরাজী ভাষায়)? আমার কি সত্যিই ব্যবহার করা দরকার errors.add :base, msg? ত্রুটিটি কোন কলামটি সম্পর্কে রয়েছে তা আমি জানতে চাই, তাই আমি এটি সঠিক ফর্ম ক্ষেত্রে প্রদর্শন করতে পারি।
পানজি

6
@ গ্রেবু সম্ভবত আমি কিছু মিস করছি, তবে এটি কি সর্বদা বার্তার আগে কলামের নামটি প্রেন্ড করে না? এমনকি ইংরেজিতেও আমি চাই উদাহরণস্বরূপ The password is wrong.বা এর The email address is not valid.পরিবর্তে Password is wrong.এবং Email is not valid.
পানজি

65

আপনার মডেল:

validates_presence_of :address1, message: 'Put some address please' 

আপনার দৃষ্টিতে

<% m.errors.each do |attr, msg|  %>
 <%= msg %>
<% end %>

আপনি যদি পরিবর্তে না

<%= attr %> <%= msg %>

বৈশিষ্ট্যের নামের সাথে আপনি এই ত্রুটি বার্তাটি পান

address1 Put some address please

আপনি যদি একটি একক বৈশিষ্ট্যের জন্য ত্রুটি বার্তা পেতে চান

<%= @model.errors[:address1] %>

এটি কোনও গ্রহণযোগ্য সমাধান নয়। যদি আমি অন্যান্য সমস্ত বৈশিষ্ট্যের (অ্যাট্রি + msg) এর জন্য ডিফল্ট আচরণ চাই?
রামুলো সেকন

আপনি সেখানে যান .. আপনি এই 2 টি জিনিস নিয়ে খেলতে পারেন এবং এটি কার্যকর করতে পারেন
ফেডেরিকো

আপনাকে একটি চিহ্ন ব্যবহার করতে হবে যাতে এটি আপনার yML ফাইলগুলিতে সন্ধান করবে, যেমনvalidates_presence_of :address1, :message => :put_some_address_please
ফেডেরিকো

ক্ষেত্রের নাম অন্তর্ভুক্ত হওয়ার সাথে সাথে এটি গ্রহণযোগ্য নয়
ফতুহোকু

62

এটা চেষ্টা কর.

class User < ActiveRecord::Base
  validate do |user|
    user.errors.add_to_base("Country can't be blank") if user.country_iso.blank?
  end
end

আমি এটি এখানে পেয়েছি ।

এটি করার আরেকটি উপায় এখানে। আপনি যা করেন তা হ'ল মডেল ক্লাসে একটি মানব_সত্তিবদ্ধ নামকরণ পদ্ধতিটি সংজ্ঞায়িত করা। পদ্ধতিটি কলামের নামটি একটি স্ট্রিং হিসাবে পাস করেছে এবং বৈধতা বার্তাগুলিতে স্ট্রিংটি ব্যবহার করতে দেয়।

class User < ActiveRecord::Base

  HUMANIZED_ATTRIBUTES = {
    :email => "E-mail address"
  }

  def self.human_attribute_name(attr)
    HUMANIZED_ATTRIBUTES[attr.to_sym] || super
  end

end

উপরের কোডটি এখান থেকে


সমস্যাটি হ'ল আমার ক্ষেত্রটি বলা হয়: song_rep_xyz (ভাল, কিছু জটিল), যা ব্যবহারকারী বান্ধব নয়
marggg

16
রেল 3 এর জন্য, "ডিফ সেল্ফ। হিউম্যান_্যাট্রিবিউট_নেম (অ্যাটর)" কে "ডিফ সেল্ফ.মানুষ_ট্রিবিউট_নেম (অ্যাট্রি, অপশন =}})" এ পরিবর্তন করা দরকার, অন্যথায় এটি একটি ত্রুটি
ফেরায়

3
এর জন্য ধন্যবাদ. আমার কাছে এমন কিছু দরকার ছিল যা রেল 2 এর জন্য কাজ করেছিল (হ্যাঁ, আমাকে দরিদ্র ... :)
ড্যান ব্যারন

18

হ্যাঁ, প্লাগিন ছাড়া এটি করার একটি উপায় আছে! তবে উল্লিখিত প্লাগইনটি ব্যবহার করার মতো এটি পরিষ্কার এবং মার্জিত নয়। এটা এখানে.

এটি 3 টি রেল ধরে নিয়েছে (আমি জানি না এটি আগের সংস্করণে আলাদা কিনা),

আপনার মডেল এ রাখুন:

validates_presence_of :song_rep_xyz, :message => "can't be empty"

এবং দেখার পরিবর্তে, ছাড়ার পরিবর্তে

@instance.errors.full_messages

এটি যেমন হবে যখন আমরা স্ক্যাফোল্ড জেনারেটরটি ব্যবহার করি, রাখুন:

@instance.errors.first[1]

এবং আপনি মডেলটিতে উল্লিখিত কেবলমাত্র বার্তাটি পাবেন, কোনও অ্যাট্রিবিউট নাম ছাড়াই।

ব্যাখ্যা:

#returns an hash of messages, one element foreach field error, in this particular case would be just one element in the hash:
@instance.errors  # => {:song_rep_xyz=>"can't be empty"}

#this returns the first element of the hash as an array like [:key,"value"]
@instance.errors.first # => [:song_rep_xyz, "can't be empty"]

#by doing the following, you are telling ruby to take just the second element of that array, which is the message.
@instance.errors.first[1]

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

আশা করি যে সাহায্য করেছে।


16

সম্পূর্ণ স্থানীয়ীকৃত বার্তাগুলির সাথে রেলস 3 কোড:

মডেল user.rb মধ্যে বৈধতা সংজ্ঞায়িত

validates :email, :presence => true

কনফিগারেশনে / লোকেল / এন.আইএমএল

en:  
  activerecord:
    models: 
      user: "Customer"
    attributes:
      user:
        email: "Email address"
    errors:
      models:
        user:
          attributes:
            email:
              blank: "cannot be empty"

15

কাস্টম বৈধকরণ পদ্ধতিতে ব্যবহার করুন:

errors.add(:base, "Custom error message")

add_to_base হিসাবে অবচিত করা হয়েছে।

errors.add_to_base("Custom error message")


13

সম্পর্কে গৃহীত উত্তর এবং ডাউন তালিকা অন্য উত্তর :

আমি নিশ্চিত করছি যে ন্যানামকিমের কাস্টম-এরর-কাঁটা কাঁটাচামচ কাঁটাচামচ 5 টি, এবং লোকাল সেটআপের সাথে কাজ করে।

আপনাকে কেবল একটি ক্যারেট দিয়ে লোকেল বার্তা শুরু করতে হবে এবং এটি বার্তায় বৈশিষ্ট্যের নামটি প্রদর্শন করা উচিত নয়।

একটি মডেল হিসাবে সংজ্ঞায়িত:

class Item < ApplicationRecord
  validates :name, presence: true
end

নিম্নলিখিত সহ en.yml:

en:
  activerecord:
    errors:
      models:
        item:
          attributes:
            name:
              blank: "^You can't create an item without a name."

item.errors.full_messages প্রদর্শিত হবে:

You can't create an item without a name

স্বাভাবিকের পরিবর্তে Name You can't create an item without a name


11

আমি ক্রেডিট_অরর_ম্যাসেজ রত্ন (বা প্লাগইন হিসাবে ) মূলত ডেভিড ইজলি রচিত

এটি আপনাকে এই জাতীয় জিনিসগুলি করতে দেয়:

validates_presence_of :non_friendly_field_name, :message => "^Friendly field name is blank"

আমি এই প্লাগইনটি অতীতে সাফল্যের সাথে ব্যবহার করেছি যদিও এটি আর নিয়মিত রক্ষণাবেক্ষণ হয় না বলে মনে হয়।
জ্যারেড ব্রাউন

1
আপনি alse পাগল 3. জন্য একটি মণি যেমন ইনস্টল করতে পারেন শুধু যোগ gem "custom_error_message" আপনার Gemfile করুন - দেখুন GitHub আরো বিস্তারিত জানার জন্য
ডরিয়ান


3
@ ডিকিবয় আমি নিশ্চিত করেছি যে নানামকিমের কাঁটাচামচ ( github.com/nanamkim/custom-err-msg ) রেল ৫ এর সাথে কাজ করে। এটি আসলে গৃহীত উত্তরের সাথে দুর্দান্ত অভিনয় করে। আমি এটি একটি পৃথক উত্তর হিসাবে লিখব।
রাইস্ট্রাম

@ রাইস্ট্রাম আমার জীবনের জন্য আমি এর চারপাশের ইউজকেসগুলি মনে করতে পারি না, তবে উত্তরের জন্য ধন্যবাদ! আমি ভবিষ্যতের জন্য এটি মনে রাখবেন নিশ্চিত।
ডিকিবয়

10

একটি সমাধান হতে পারে i18n ডিফল্ট ত্রুটি ফর্ম্যাটটি পরিবর্তন করা:

en:
  errors:
    format: "%{message}"

ডিফল্ট হয় format: %{attribute} %{message}


7

এখানে অন্য উপায়:

আপনি যদি এই টেমপ্লেটটি ব্যবহার করেন:

<% if @thing.errors.any? %>
  <ul>
    <% @thing.errors.full_messages.each do |message| %>
      <li><%= message %></li>
    <% end %>
  </ul>
<% end %>

আপনি নিজের কাস্টম বার্তাটি এভাবে লিখতে পারেন:

class Thing < ActiveRecord::Base

  validate :custom_validation_method_with_message

  def custom_validation_method_with_message
    if some_model_attribute.blank?
      errors.add(:_, "My custom message")
    end
  end

এইভাবে, আন্ডারস্কোরের কারণে, পুরো বার্তাটি "আমার কাস্টম বার্তা" হয়ে ওঠে, তবে শুরুতে অতিরিক্ত স্থানটি অদম্য। আপনি যদি শুরুতে অতিরিক্ত স্থানটি না চান তবে কেবল .lstripপদ্ধতিটি যুক্ত করুন।

<% if @thing.errors.any? %>
  <ul>
    <% @thing.errors.full_messages.each do |message| %>
      <li><%= message.lstrip %></li>
    <% end %>
  </ul>
<% end %>

স্ট্রিং.লস্ট্রিয়াপ পদ্ধতিটি ': _' দ্বারা নির্মিত অতিরিক্ত স্থান থেকে মুক্তি পাবে এবং অন্য কোনও ত্রুটি বার্তা অপরিবর্তিত রেখে দেবে।

বা আরও ভাল, আপনার কাস্টম বার্তার প্রথম শব্দটি কী হিসাবে ব্যবহার করুন:

  def custom_validation_method_with_message
    if some_model_attribute.blank?
      errors.add(:my, "custom message")
    end
  end

এখন পুরো বার্তাটি কোনও অতিরিক্ত জায়গা ছাড়াই "আমার কাস্টম বার্তা" হবে।

আপনি যদি পুরো বার্তাটি "ইউআরএল ফাঁকা রাখতে পারবেন না" এর মতো মূলধন দিয়ে শুরু করতে চান তবে এটি করা যায় না। পরিবর্তে কী হিসাবে অন্য কিছু শব্দ যুক্ত করার চেষ্টা করুন:

  def custom_validation_method_with_message
    if some_model_attribute.blank?
      errors.add(:the, "URL can't be blank")
    end
  end

এখন পুরো বার্তাটি হবে "URL টি ফাঁকা থাকতে পারে না"


ওও, আপনি এমনকি errors.add(:_, 'foobar')বার্তা হিসাবে '
ফুবার

6

সাধারণভাবে এটি করুন:

validates_presence_of :email, :message => "Email is required."

পরিবর্তে এটি প্রদর্শিত

<% if @user.errors.any? %>
  <% @user.errors.messages.each do |message| %>
    <div class="message"><%= message.last.last.html_safe %></div>
  <% end %>
<% end %>

রিটার্নস

"Email is required."

স্থানীয়করণের পদ্ধতিটি অবশ্যই এটি করার "যথাযথ" উপায়, তবে আপনি যদি কিছুটা অ-বৈশ্বিক প্রকল্প করেন এবং কেবল দ্রুত এগিয়ে যেতে চান - এটি ফাইল হপিংয়ের চেয়ে অবশ্যই সহজ।

ফিল্ডের নামটি স্ট্রিংয়ের শুরু বাদে অন্য কোথাও রাখার দক্ষতার জন্য আমি এটি পছন্দ করি:

validates_uniqueness_of :email, :message => "There is already an account with that email."

2

আপনি যদি তাদের সকলকে একটি দুর্দান্ত তালিকায় তালিকাবদ্ধ করতে চান তবে ক্রুডি অ মানবিক বান্ধব নামটি ব্যবহার না করেই আপনি এটি করতে পারেন ...

object.errors.each do |attr,message|
  puts "<li>"+message+"</li>"
end

1

আপনার দৃষ্টিতে

object.errors.each do |attr,msg|
  if msg.is_a? String
    if attr == :base
      content_tag :li, msg
    elsif msg[0] == "^"
      content_tag :li, msg[1..-1]
    else
      content_tag :li, "#{object.class.human_attribute_name(attr)} #{msg}"
    end
  end
end

আপনি যখন অ্যাট্রিবিউট নামটি ছাড়াই ত্রুটি বার্তাকে ওভাররাইড করতে চান, কেবল মেসেজটি ^ লাইক দিয়ে প্রিন্ট করুন:

validates :last_name,
  uniqueness: {
    scope: [:first_name, :course_id, :user_id],
    case_sensitive: false,
    message: "^This student has already been registered."
  }

রেল 5.1 / রুবি ২.৪ নিয়ে কাজ করে না? সেই সুযোগে মডেলটির নাম পাওয়া
বেন

@ বেইন আমার জন্য রেলগুলি 5.1.2, রুবি 2.4.1p111 এ কাজ করে। আপনি কি আপনার কোড শেয়ার করতে পারেন?
ভাগ্যবানী

আমি অনুমান করি যে আমাকে আরও সন্ধান করতে হবে, আপনি সেখানে কোড এবং তার উত্তরটি পরীক্ষা করতে পারেন stackoverflow.com/q/45128434/102133
বেন

0

আমি অনুসরণ করার চেষ্টা করেছি, আমার জন্য কাজ করেছেন :)

1 জব.আরবি

class Job < ApplicationRecord
    validates :description, presence: true
    validates :title, 
              :presence => true, 
              :length => { :minimum => 5, :message => "Must be at least 5 characters"}
end

2 জবস_কন্ট্রোলআরআরবি

def create
      @job = Job.create(job_params)
      if @job.valid?
        redirect_to jobs_path
      else
        render new_job_path
      end     
    end

3 _for.html.erb

<%= form_for @job do |f| %>
  <% if @job.errors.any? %>
    <h2>Errors</h2>
    <ul>
      <% @job.errors.full_messages.each do |message|%>
        <li><%= message %></li>
      <% end %>  
    </ul>
  <% end %>
  <div>
    <%= f.label :title %>
    <%= f.text_field :title %>
  </div>
  <div>
    <%= f.label :description %>
    <%= f.text_area :description, size: '60x6' %>

  </div>
  <div>
    <%= f.submit %>
  </div>
<% end %> 

0

আপনার কোডটি এখনও প্রয়োজন হলে এটি আমার কোডের জন্য কার্যকর হতে পারে: আমার মডেল:

validates :director, acceptance: {message: "^Please confirm that you are a director of the company."}, on: :create, if: :is_director?

তারপরে আমি বার্তাগুলি দেখানোর জন্য একটি সহায়ক তৈরি করেছি:

module ErrorHelper
  def error_messages!
    return "" unless error_messages?
    messages = resource.errors.full_messages.map { |msg|
       if msg.present? && !msg.index("^").nil?
         content_tag(:p, msg.slice((msg.index("^")+1)..-1))
       else
         content_tag(:p, msg)
       end
    }.join

    html = <<-HTML
      <div class="general-error alert show">
        #{messages}
      </div>
    HTML

    html.html_safe
  end

  def error_messages?
    !resource.errors.empty?
  end
end

0

একটি অনন্য পদ্ধতির আমি কাউকে উল্লেখ করতে দেখিনি!

আমি যে সমস্ত কাস্টমাইজেশন চেয়েছিলাম তার একমাত্র উপায় হ'ল after_validationত্রুটি বার্তাটি আমাকে পরিচালনা করার জন্য একটি কলব্যাক ব্যবহার করা use

  1. বৈধতা বার্তাটিকে সাধারণ হিসাবে তৈরি করার অনুমতি দিন, আপনার যাচাইকরণ সহায়কটিতে চেষ্টা করার দরকার নেই।

  2. একটি after_validationকলব্যাক তৈরি করুন যা ভিউতে আসার আগেই সেই বৈধতা বার্তাটিকে ব্যাক-এন্ডে প্রতিস্থাপন করবে।

  3. ইন after_validationপদ্ধতি আপনি শুধু একটি স্বাভাবিক স্ট্রিং মত কিছু বৈধতা বার্তা সঙ্গে চান করতে পারেন! এমনকি আপনি গতিশীল মানগুলি ব্যবহার করতে পারেন এবং এটিকে বৈধতা বার্তায় সন্নিবেশ করতে পারেন।


#this could be any validation
validates_presence_of :song_rep_xyz, :message => "whatever you want - who cares - we will replace you later"

after_validation :replace_validation_message

def replace_validation_message
    custom_value = #any value you would like
    errors.messages[:name_of_the_attribute] = ["^This is the replacement message where 
    you can now add your own dynamic values!!! #{custom_value}"]
end

উত্তর-বৈধকরণের পদ্ধতিটি রেল-ইন বৈধতা সহায়তার তুলনায় অনেক বেশি সুযোগ পাবে, সুতরাং আপনি অবজেক্ট.ফাইল_নামের সাথে করার চেষ্টা করার মতো আপনি যা যা যাচাই করছেন সেটিকে অ্যাক্সেস করতে সক্ষম হবেন। আপনি যেখানে ফোন করার চেষ্টা করছেন সেখানে যা যাচাইকরণ সহায়কটিতে কাজ করে না।

নোট: আমরা ব্যবহার ^বৈধতা শুরুতে অ্যাট্রিবিউট নাম পরিত্রাণ পেতে হিসাবে @Rystraum এই উল্লেখ নির্দিষ্ট মণি


0

যদি ক্ষেত্রের নামটি দেখানোর ক্ষেত্রে এটি প্রকৃতপক্ষে আলাদা আলাদা হয় তবে ধূসরর উত্তরটি সর্বোত্তম। গতিশীল ক্ষেত্রের নামের ক্ষেত্রে (প্রদর্শিত অন্যান্য ক্ষেত্রের উপর ভিত্তি করে), আমি এরকম কিছু করব

<% object.errors.each do |attr, msg| %>
<li>
  <% case attr.to_sym %>
  <% when :song_rep_xyz %>
    <%= #display error how you want here %>
  <% else %>
    <%= object.errors.full_message(attr, msg) %>
  <% end %>
</li>
<% end %>

অন্যদিকে পূর্ণ_ ম্যাসেজ পদ্ধতিটি রেলগুলি পূর্ণ_ ম্যাসেজ পদ্ধতির অভ্যন্তরে কী ব্যবহার করে, তাই এটি অন্যান্য ক্ষেত্রে সাধারণ রেলের ত্রুটিগুলি প্রদান করবে (3..২ এবং তার বেশি)

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