(আমি কয়েক মাস আগে এই পোস্টটি আমার তালিকায় পাঠিয়েছিলাম। আপনি যদি এটি পছন্দ করেন, এবং এটির মতো আরও পড়তে চান তবে আপনাকে সাইন আপ করা উচিত!)
আমি আমার একটি অ্যাপের সাথে অন্য দিন একটি অদ্ভুত পরিস্থিতিতে পড়েছিলাম৷
বলুন আপনার একটি Article
আছে মডেল, এবং এই নিবন্ধগুলি প্রথমে খসড়া হিসাবে তৈরি করা হয়। এই খসড়াগুলি হালকা হওয়া উচিত। আপনি একটি বডি, এমনকি একটি শিরোনাম ছাড়াই এগুলি তৈরি এবং সম্পাদনা করতে সক্ষম হতে চান৷
কিন্তু আপনি যখন প্রকাশ করুন এই নিবন্ধ, আপনি কিছু অতিরিক্ত বৈধতা আছে প্রয়োজন. তাদের একটি শিরোনাম, একটি বডি এবং বাকি সমস্ত জিনিস থাকা উচিত।
আপনি একগুচ্ছ if
লিখতে পারেন বিবৃতি নিজেকে চেক করতে. কিন্তু আপনার কাছে রেল থেকে পাওয়া সব সুন্দর ফর্ম হ্যান্ডলিং থাকবে না। এবং আমি খুঁজে পেয়েছি যে রেলগুলি যে জিনিসগুলি ভালভাবে পরিচালনা করে সেগুলির জন্য রেলের সাথে যাওয়া আপনাকে পরে অনেক মাথাব্যথা বাঁচাবে। এটির জন্য বৈধতা ব্যবহার করার একটি উপায় এখনও আছে?
if
এবং unless
?
বৈধকরণ সমর্থন :if
এবং :unless
পরামিতি, কিন্তু এটি সবসময় এত পরিষ্কার হয় না:
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/। এটা পড়া মূল্যবান। আমাদের উদাহরণের জন্য এটি দেখতে কেমন তা দেখা যাক:
class Article < ActiveRecord::Base
# validate in draft mode
validates_presence_of :author_id
# validate only when published
validates_presence_of :body, on: :publish
...
end
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)
-কে অর্পণ করে ) আমি সত্যিই এর চেহারা পছন্দ করি:
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
আপনার বৈধতা উপর. কিন্তু রেলের অনেক জিনিসের মতো, কাস্টম বৈধতা প্রসঙ্গগুলি পঠনযোগ্যতা এবং নমনীয়তার মধ্যে একটি ভাল আপস৷