কম্পিউটার

বিভিন্ন বৈধতা পরিস্থিতি পরিচালনা করার জন্য একটি হালকা উপায়

(আমি কয়েক মাস আগে এই পোস্টটি আমার তালিকায় পাঠিয়েছিলাম। আপনি যদি এটি পছন্দ করেন, এবং এটির মতো আরও পড়তে চান তবে আপনাকে সাইন আপ করা উচিত!)

আমি আমার একটি অ্যাপের সাথে অন্য দিন একটি অদ্ভুত পরিস্থিতিতে পড়েছিলাম৷

বলুন আপনার একটি Article আছে মডেল, এবং এই নিবন্ধগুলি প্রথমে খসড়া হিসাবে তৈরি করা হয়। এই খসড়াগুলি হালকা হওয়া উচিত। আপনি একটি বডি, এমনকি একটি শিরোনাম ছাড়াই এগুলি তৈরি এবং সম্পাদনা করতে সক্ষম হতে চান৷

কিন্তু আপনি যখন প্রকাশ করুন এই নিবন্ধ, আপনি কিছু অতিরিক্ত বৈধতা আছে প্রয়োজন. তাদের একটি শিরোনাম, একটি বডি এবং বাকি সমস্ত জিনিস থাকা উচিত।

আপনি একগুচ্ছ if লিখতে পারেন বিবৃতি নিজেকে চেক করতে. কিন্তু আপনার কাছে রেল থেকে পাওয়া সব সুন্দর ফর্ম হ্যান্ডলিং থাকবে না। এবং আমি খুঁজে পেয়েছি যে রেলগুলি যে জিনিসগুলি ভালভাবে পরিচালনা করে সেগুলির জন্য রেলের সাথে যাওয়া আপনাকে পরে অনেক মাথাব্যথা বাঁচাবে। এটির জন্য বৈধতা ব্যবহার করার একটি উপায় এখনও আছে?

if এবং unless ?

বৈধকরণ সমর্থন :if এবং :unless পরামিতি, কিন্তু এটি সবসময় এত পরিষ্কার হয় না:

app/models/article.rb
class Article < ActiveRecord::Base
  # validate in draft mode
  validates_presence_of :author_id 

  # validate only when published
  validates_presence_of :body, unless: lambda { |o| o.draft? }
  
  ...
end

এছাড়া, আমি যেভাবে একটি নিবন্ধ প্রকাশ করতে চাই তা নয়৷৷ আমি একটি ক্রিয়া হিসাবে একটি নিবন্ধ প্রকাশ করার বিষয়ে চিন্তা করতে চাই৷ , একটি রাষ্ট্র নয় নিবন্ধটি রয়েছে, তাই একটি বৈশিষ্ট্য সেট করা এবং পরীক্ষা করা সঠিক উত্তর নয়।

একটি স্বল্প পরিচিত, হালকাভাবে নথিভুক্ত রেল বৈশিষ্ট্য

এই সমস্যাটি রেলের বৈধতা প্রসঙ্গগুলির জন্য একটি নিখুঁত ফিট। আমি প্রথমে DHH এর লেখা একটি সংক্ষিপ্ত বিবরণ থেকে কাস্টম বৈধতা প্রসঙ্গ সম্পর্কে শিখেছি। কিন্তু এগুলি কী এবং কীভাবে ব্যবহার করা যায় তার একটি ভাল ব্যাখ্যা খুঁজে পাওয়া কঠিন ছিল৷

কাস্টম প্রসঙ্গগুলির জন্য ডকুমেন্টেশন বেশ পাতলা। এটির একমাত্র উল্লেখ আমি API ডক্সে খুঁজে পেতে পারি এখানে ছিল। এবং এই বৈধতার জন্য API ডক্সে কাস্টম প্রসঙ্গগুলি মোটেই উল্লেখ করে না! এটি এটিকে বিশেষভাবে কঠিন করে তোলে – যদি আপনি না জানেন যে কোন কিছুকে কী বলা হয়, তাহলে আপনি কীভাবে এটিতে আরও ডকুমেন্টেশন পাবেন?

আমি অবশেষে এখানে একটি ভাল ওভারভিউ পেয়েছি:https://blog.arkency.com/2014/04/mastering-rails-validations-contexts/। এটা পড়া মূল্যবান। আমাদের উদাহরণের জন্য এটি দেখতে কেমন তা দেখা যাক:

app/models/article.rb
class Article < ActiveRecord::Base
  # validate in draft mode
  validates_presence_of :author_id
 
  # validate only when published
  validates_presence_of :body, on: :publish
  ...
end
app/controllers/article_controller.rb
class ArticleController < ApplicationController
  respond_to :html

  def create
    @article = Article.create(article_params)
    respond_with @article
  end

  def publish
    @article = Article.find(params[:id])
    @article.attributes = article_params
    @article.save(context: :publish)
    respond_with @article
  end

  private
  def article_params
    params.
      require(:article).
      permit(:body, :title, :author_id)
  end
end

এতোটা খারাপ না! একমাত্র অদ্ভুত জিনিস হল save ব্যবহার করা update এর পরিবর্তে প্রকাশ পদ্ধতিতে। এটি ঘটে কারণ update একটি প্যারামিটার হিসাবে একটি বৈধতা প্রসঙ্গ নিতে পারে না. (সম্ভবত এটি একটি পুল অনুরোধের জন্য একটি সুযোগ?)

সংরক্ষণের বাইরে

কাস্টম বৈধতা প্রসঙ্গগুলি শুধুমাত্র বিভিন্ন উপায়ে একটি রেকর্ড সংরক্ষণ করার চেয়ে আরও অনেক কিছুর জন্য দরকারী। প্রসঙ্গগুলি valid? এর সাথে কাজ করে :

@article.valid?(:publish)

তাই আপনি যে কোনও জায়গায় বৈধতা প্রসঙ্গ ব্যবহার করতে পারেন যেখানে আপনি প্রশ্নের উত্তর দিতে চান:“এই বস্তুটির কি এই সম্পত্তি আছে? আর যদি না হয়, কেন নয়?"

DHH -able? দিয়ে শেষ হওয়া একটি পদ্ধতি তৈরি করে যেটি valid?(:context)-কে অর্পণ করে ) আমি সত্যিই এর চেহারা পছন্দ করি:

app/models/article.rb
class Article
  validate :has_been_published, on: :view
  validate :is_not_spam, on: :view

  def viewable?
    valid? :view
  end

  private

  def has_been_published
    if published_at.future?
      errors.add(:published_at, "is in the future")
    end
  end

  def is_not_spam
    if is_spam?(body)
      errors.add(:body, "has been detected as spam")
    end
  end
end

এইভাবে, আপনি যখন এটি চেক করেন, তখন আপনি শুধু true থেকে আরও বেশি তথ্য পাবেন অথবা false :

unless @article.viewable?
  # @article.errors is now filled out
end

নিবন্ধটি দর্শনযোগ্য? আচ্ছা, কেন নয়?

শুধু যথেষ্ট হালকা

আপনি এই ধরনের বৈধতা আচরণ পেতে পারেন কিছু অন্যান্য উপায় আছে. আপনি কাস্টম ActiveModel তৈরি করতে পারেন তাদের নিজস্ব বৈধতা সঙ্গে সেবা বস্তু. আপনি :if ব্যবহার করতে পারেন অথবা :unless আপনার বৈধতা উপর. কিন্তু রেলের অনেক জিনিসের মতো, কাস্টম বৈধতা প্রসঙ্গগুলি পঠনযোগ্যতা এবং নমনীয়তার মধ্যে একটি ভাল আপস৷


  1. এনলাইটেনমেন্ট ডেস্কটপ রিভিউ:একটি সুন্দর, হালকা কিন্তু ভিন্ন ডেস্কটপ ম্যানেজার

  2. যেকোনো র্যাক অ্যাপ্লিকেশনে ইনবাউন্ড ইমেল পরিচালনা করুন

  3. আপনার রেল অ্যাপের কর্মক্ষমতা বোঝার একটি নতুন উপায়

  4. রেল কিভাবে রত্ন হ্যান্ডেল করে?