আমি কীভাবে রেলের কোনও তারিখকে বৈধতা দেব?


92

আমি আমার মডেলটিতে রুবেল অন রেলে একটি তারিখ যাচাই করতে চাই, তবে, দিন, মাস এবং বছরের মানগুলি আমার মডেলটিতে পৌঁছানোর আগেই ইতিমধ্যে একটি ভুল তারিখে রূপান্তরিত হয়।

উদাহরণস্বরূপ, আমি যদি 31 ফেব্রুয়ারী ২০০৯ এ আমার দৃষ্টিতে প্রবেশ করি, যখন আমি Model.new(params[:model])আমার নিয়ামকটি ব্যবহার করি, এটি এটিকে "মার্চ 3 শে 2009"-তে রূপান্তর করে, যা আমার মডেলটি একটি বৈধ তারিখ হিসাবে দেখবে, যা এটি, তবে এটি ভুল।

আমি আমার মডেলটিতে এই বৈধতাটি সক্ষম করতে চাই। আমি যেভাবে পারি কোনও উপায় আছে, বা আমি এটি সম্পূর্ণ ভুল করছি?

আমি এই " তারিখের বৈধতা " পেয়েছি যা সমস্যাটি নিয়ে আলোচনা করে তবে এটি কখনও সমাধান হয়নি।


4
এই প্রশ্নটি বর্তমানে রেলের তারিখ বৈধতার শীর্ষস্থানীয় গুগল ফলাফলগুলির মধ্যে একটি। আমি যেমন করেছি তেমনটি আপনি প্রথম পাসে মিস করতে পারেন: নির্বাচিত উত্তরের গুরুত্বপূর্ণ অংশটি হ'ল বৈধতা_কালীন রত্ন। আমি বাকি উত্তরটিও পড়িনি কারণ আমি অন্য কোথাও বৈধতা-সময়সীমার বিষয়ে জানতে পেরেছি এবং সেই রত্নটি আমার কোনও কাস্টম কোড না লিখে আমার যা কিছু প্রয়োজন তা করে।
জেসন সোয়েট

উত্তর:


61

আমি অনুমান করছি আপনি date_selectতারিখের জন্য ট্যাগগুলি তৈরি করতে সহায়কটি ব্যবহার করছেন । আপনি এটি করতে পারেন এমন অন্য উপায়টি হ'ল দিন, মাস, বছরের ক্ষেত্রগুলির জন্য নির্বাচিত ফর্ম সহায়ক ব্যবহার করুন। এটির মতো (উদাহরণ হিসাবে আমি ব্যবহার করি তৈরি করা তারিখের ক্ষেত্র))

<%= f.select :month, (1..12).to_a, selected: @user.created_at.month %>
<%= f.select :day, (1..31).to_a, selected: @user.created_at.day %>
<%= f.select :year, ((Time.now.year - 20)..Time.now.year).to_a, selected: @user.created_at.year %>

এবং মডেলটিতে, আপনি তারিখটি বৈধতা দিন:

attr_accessor :month, :day, :year
validate :validate_created_at

private

def convert_created_at
  begin
    self.created_at = Date.civil(self.year.to_i, self.month.to_i, self.day.to_i)
  rescue ArgumentError
    false
  end
end

def validate_created_at
  errors.add("Created at date", "is invalid.") unless convert_created_at
end

আপনি যদি কোনও প্লাগইন সমাধান সন্ধান করেন তবে আমি বৈধতা_সকালীনতা প্লাগইনটি চেকআউট করব । এটি (গিথুব পৃষ্ঠা থেকে) এর মতো কাজ করে:

class Person < ActiveRecord::Base
  validates_date :date_of_birth, on_or_before: lambda { Date.current }
  # or
  validates :date_of_birth, timeliness: { on_or_before: lambda { Date.current }, type: :date }
end 

উপলব্ধ বৈধতা পদ্ধতির তালিকা নীচে রয়েছে:

validates_date     - validate value as date
validates_time     - validate value as time only i.e. '12:20pm'
validates_datetime - validate value as a full date and time
validates          - use the :timeliness key and set the type in the hash.

প্রস্তাবিত সমাধানটি আমার পক্ষে কাজ করে না এবং আমি ব্যর্থগুলি ২.৩.৫ ব্যবহার করছি
রজার

আমি এটিকে ক্লিনার হতে পুনরায় লিখেছি এবং এটি 2.3.5 রেলের বিরুদ্ধে পরীক্ষা করেছি এবং এটি আমার পক্ষে কাজ করে।
জ্যাক চু

হাই জ্যাক, আমি আপনার সমাধানটি চেষ্টা করেছি, এটি আমার জন্য অ্যাট্রি_অ্যাক্সেসযোগ্য: দিন,: মাস, বছর যোগ করার জন্য কাজ করে। যা আমার জন্য কোন অর্থ দেয় না ... ধন্যবাদ যদি আপনার কোন ধারণা থাকে!
benoitr


Validates_timeliness প্লাগইন / মণি সত্যিই ব্যবহার করতে চমৎকার। একটি কবজ কাজ করে এবং আমার কোড আরও ছোট রাখে। টিপ জন্য ধন্যবাদ.
mjnissim

20

দীর্ঘস্থায়ী রত্ন ব্যবহার:

class MyModel < ActiveRecord::Base
  validate :valid_date?

  def valid_date?
    unless Chronic.parse(from_date)
      errors.add(:from_date, "is missing or invalid")
    end
  end

end

4
এই নির্দিষ্ট উদাহরণে, Chronic.parse(from_date_before_type_cast)স্ট্রিংয়ের মান ইনপুট পেতে আমাকে ব্যবহার করতে হয়েছিল। অন্যথায় রেলগুলি to_dateক্ষেত্রটি ক্ষেত্র হওয়ায় স্ট্রিংটি টাইপকাস্ট করবে datetime
ক্যালভিন

18

আপনি যদি রেল 3 বা রুবি চান 1.9 সামঞ্জস্যের সাথে তারিখ_বৈবেদক রত্ন চেষ্টা করে ।


আমি এই চেষ্টা করেছি। বৈধতা ইনস্টল করতে এবং যুক্ত করতে 2 মিনিট সময় নিয়েছে!
jflores

11

অ্যাক্টিভ রেকর্ড আপনাকে এমন _before_type_castবৈশিষ্ট্য দেয় যা টাইপকাস্টিংয়ের আগে কাঁচা বৈশিষ্ট্যযুক্ত ডেটা ধারণ করে contain এটি প্রাক-টাইপকাস্ট মানগুলির সাথে ত্রুটি বার্তাগুলি ফেরত দেওয়ার জন্য বা টাইপকাস্টের পরে সম্ভব নয় এমন বৈধতা যাচাইয়ের জন্য কার্যকর হতে পারে।

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


4

এখানে কিছুটা দেরি হয়েছে, তবে " আমি কীভাবে রেলগুলিতে একটি তারিখকে বৈধতা দেব? " ধন্যবাদটি আমি এই বৈধ লেখককে পরিচালনা করতে পেরেছি, আশা কারও পক্ষে কার্যকর:

ভিতরে আপনার model.rb

validate :date_field_must_be_a_date_or_blank

# If your field is called :date_field, use :date_field_before_type_cast
def date_field_must_be_a_date_or_blank
  date_field_before_type_cast.to_date
rescue ArgumentError
  errors.add(:birthday, :invalid)
end

4

যেহেতু আপনার তারিখের স্ট্রিংটি আপনার মডেলের কোনও তারিখে রূপান্তরিত করার আগে আপনাকে হ্যান্ডেল করা দরকার, আমি সেই ক্ষেত্রটির জন্য অ্যাকসেসরকে ওভাররাইড করব

যাক আপনার তারিখের ক্ষেত্রটি published_date। এটি আপনার মডেল অবজেক্টে যুক্ত করুন:

def published_date=(value)
    # do sanity checking here
    # then hand it back to rails to convert and store
    self.write_attribute(:published_date, value) 
end

আমি এই উদ্দেশ্যে এটি ব্যবহার করব কিনা তা আমি জানি না, তবে এটি দুর্দান্ত পরামর্শ।
ড্যান রোজনস্টার্ক

1

এখানে একটি দীর্ঘস্থায়ী উত্তর নেই ...

class Pimping < ActiveRecord::Base

validate :valid_date?

def valid_date?
  if scheduled_on.present?
    unless scheduled_on.is_a?(Time)
      errors.add(:scheduled_on, "Is an invalid date.")
    end
  end
end

4
এটি সর্বদা মিথ্যা ফেরত দেয়: "1/1/2013".is_a?(Date)- তারিখটি ব্যবহারকারী ইনপুট থেকে আসে, সুতরাং এটি স্ট্রিং হিসাবে খাওয়ানো হচ্ছে। আমি আগে এটি একটি তারিখ হিসাবে পার্স করতে হবে?
মোহামাদ

সঠিক। Date.parse("1/1/2013").is_a?(Date), তবে আপনি দেখতে পেলেন যে এটি মোটেও বিশ্লেষণ না করে, এটি সম্ভবত একটি তারিখও নয়।
ট্রিপ

4
যুক্তি ত্রুটিটি উদ্ধার করা দরকার ... আহা, এটি কেবলমাত্র স্ট্রিংটি স্বয়ংক্রিয়ভাবে পার্স করা থাকলে দুর্দান্ত হত ... ওহ ভাল, এর জন্য রত্ন রয়েছে।
মোহামাদ

0

আপনি যেমন তারিখ এবং সময়কে বৈধ করতে পারেন (আপনি যদি কাস্টম নির্বাচন ব্যবহার করেন তবে আপনার প্যারামগুলিতে অ্যাক্সেস সহ আপনার নিয়ামকের কোথাও কোনও পদ্ধতিতে) ...

# Set parameters
year = params[:date][:year].to_i
month = params[:date][:month].to_i
mday = params[:date][:mday].to_i
hour = params[:date][:hour].to_i
minute = params[:date][:minute].to_i

# Validate date, time and hour
valid_date    = Date.valid_date? year, month, mday
valid_hour    = (0..23).to_a.include? hour
valid_minute  = (0..59).to_a.include? minute
valid_time    = valid_hour && valid_minute

# Check if parameters are valid and generate appropriate date
if valid_date && valid_time
  second = 0
  offset = '0'
  DateTime.civil(year, month, mday, hour, minute, second, offset)
else
  # Some fallback if you want like ...
  DateTime.current.utc
end

-2

আপনি কি validates_date_timeপ্লাগ-ইন চেষ্টা করেছেন ?


যদিও এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, উত্তরের প্রয়োজনীয় অংশগুলি এখানে অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্কটি সরবরাহ করা ভাল। লিঙ্কযুক্ত পৃষ্ঠাগুলি পরিবর্তিত হলে লিঙ্ক-শুধুমাত্র উত্তরগুলি অবৈধ হতে পারে।
পিনাল

আমি আমার উত্তর ভাল পছন্দ। দু'জন রাজি।
রায়ান ডাফিল্ড

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