4 রেলগুলিতে উদ্বেগগুলি কীভাবে ব্যবহার করবেন


627

ডিফল্ট রেলস 4 প্রকল্পের জেনারেটর এখন নিয়ন্ত্রণকারী এবং মডেলগুলির অধীনে ডিরেক্টরিটি "উদ্বেগ" তৈরি করে। রাউটিং উদ্বেগগুলি কীভাবে ব্যবহার করতে হয় সে সম্পর্কে আমি কিছু ব্যাখ্যা পেয়েছি, তবে নিয়ন্ত্রক বা মডেলগুলির কিছুই নয়।

আমি নিশ্চিত যে এটি সম্প্রদায়ের বর্তমান "ডিসিআই ট্রেন্ড" এর সাথে করার আছে এবং এটি চেষ্টা করে দেখতে চাই।

প্রশ্নটি হল, আমার এই বৈশিষ্ট্যটি কীভাবে ব্যবহার করার কথা, কীভাবে নামকরণ / শ্রেণি শ্রেণিবিন্যাসকে এটি কার্যকর করার জন্য সংজ্ঞা দেওয়া যায় সে সম্পর্কে কোনও সম্মেলন রয়েছে? আমি কীভাবে কোনও মডেল বা নিয়ামককে উদ্বেগ অন্তর্ভুক্ত করতে পারি?

উত্তর:


617

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

উদাহরণ হিসাবে, আমি একটি সুপরিচিত প্যাটার্ন, ট্যাগযোগ্য প্যাটার্ন রাখব:

# app/models/product.rb
class Product
  include Taggable

  ...
end

# app/models/concerns/taggable.rb
# notice that the file name has to match the module name 
# (applying Rails conventions for autoloading)
module Taggable
  extend ActiveSupport::Concern

  included do
    has_many :taggings, as: :taggable
    has_many :tags, through: :taggings

    class_attribute :tag_limit
  end

  def tags_string
    tags.map(&:name).join(', ')
  end

  def tags_string=(tag_string)
    tag_names = tag_string.to_s.split(', ')

    tag_names.each do |tag_name|
      tags.build(name: tag_name)
    end
  end

  # methods defined here are going to extend the class, not the instance of it
  module ClassMethods

    def tag_limit(value)
      self.tag_limit_value = value
    end

  end

end

সুতরাং পণ্যের নমুনা অনুসরণ করে, আপনি ট্যাগগেবেল যে কোনও শ্রেণিতে চান তাতে যুক্ত করতে পারেন এবং এর কার্যকারিতা ভাগ করে নিতে পারেন।

এটি ডিএইচএইচ দ্বারা সুন্দরভাবে ব্যাখ্যা করেছেন :

4 রেলগুলিতে, আমরা প্রোগ্রামারগুলিকে ডিফল্ট অ্যাপ / মডেল / উদ্বেগ এবং অ্যাপ / নিয়ন্ত্রণকারী / উদ্বেগ ডিরেক্টরিগুলি যা স্বয়ংক্রিয়ভাবে লোড পাথের অংশ হিসাবে উদ্বেগগুলি ব্যবহার করতে আমন্ত্রণ জানাতে চলেছি। অ্যাক্টিভসপোর্ট: কনসার্ন র‌্যাপারের সাথে একত্রে, এই হালকা ওজনের ফ্যাক্টরিং ব্যবস্থাটি আলোকিত করার পক্ষে এটি যথেষ্ট সমর্থন।


11
ডিসিআই একটি কনটেক্সট নিয়ে কাজ করে, মানসিক মডেল তৈরি করতে কোডগুলিকে মানচিত্রের জন্য পরিচয়কারী হিসাবে ভূমিকাটি ব্যবহার করে / ব্যবহারের ক্ষেত্রে কোনও র‍্যাপার ব্যবহারের প্রয়োজন নেই (পদ্ধতিগুলি রানটাইমের সময় সরাসরি বস্তুর সাথে আবদ্ধ থাকে) সুতরাং ডিসিআইয়ের সাথে এটির আসলে কিছুই করার নেই।
ciscoheat

2
@ ইয়াগুয়ার এমনকি রানটাইম সহ এটি অন্তর্ভুক্ত করে এটি ডিসিআই করে না। আপনি যদি কোনও রুবি ডিসিআই উদাহরণ বাস্তবায়ন দেখতে চান। পারেন কটাক্ষপাত fulloo.info বা উদাহরণ github.com/runefs/Moby কিভাবে তুবড়ি ব্যবহার করতে রুবি মধ্যে ডিসিআই করতে জন্য অথবা কি ডিসিআই হয় runefs.com (কি ডিসিআই হয়। পোস্টে আমি তাদের একটি সিরিজ সবেমাত্র শুরু হয়েছে)
রুন এফএস

1
@ রুনএফএস এবং অ্যান্ড সিস্কোহিট আপনি উভয়ই ঠিক ছিলেন। আমি শুধু নিবন্ধ এবং তথ্য আবার বিশ্লেষণ। এবং, আমি গত সপ্তাহান্তে একটি রুবি সম্মেলনে গিয়েছিলাম যেখানে একটি কথা ছিল ডিসিআই সম্পর্কে এবং অবশেষে আমি এর দর্শন সম্পর্কে আরও কিছুটা বুঝতে পেরেছিলাম। পাঠ্য পরিবর্তন হয়েছে যাতে এটি ডিসিআইয়ের উল্লেখ করে না।
ইয়াগুয়ার

9
এটি উল্লেখযোগ্য (এবং সম্ভবত একটি উদাহরণ সহ) যে শ্রেণি পদ্ধতিগুলি একটি বিশেষভাবে নামযুক্ত মডিউল ClassMethods এ সংজ্ঞায়িত হওয়ার কথা, এবং এই মডিউলটি বেস ক্লাস দ্বারা প্রসারিত করা হবে অ্যাক্টিভসপোর্ট :: কনসার্নও।
ফেবিল করছে

1
এই উদাহরণের জন্য আপনাকে ধন্যবাদ, প্রধানত খ / সি আমি ক্লাসমেথডস মডিউলটির ভিতরে আমার ক্লাস স্তরের পদ্ধতিগুলি স্ব-যা-যা কিছু দিয়েই সংজ্ঞায়িত করছি এবং এটি কাজ করে না = পি
রায়ান ক্রিউস

378

আমি ত্বক-নাইট ফ্যাট মডেলগুলিতে মডেল উদ্বেগগুলি ব্যবহার করার পাশাপাশি আপনার মডেল কোডগুলি ডিআরওয়াই সম্পর্কে পড়ছি । উদাহরণ সহ একটি ব্যাখ্যা এখানে:

1) মডেল কোডগুলি DRYing করা

একটি নিবন্ধ মডেল, একটি ইভেন্ট মডেল এবং একটি মন্তব্য মডেল বিবেচনা করুন। একটি নিবন্ধ বা একটি ইভেন্ট অনেক মন্তব্য আছে। একটি মন্তব্য নিবন্ধ বা ইভেন্ট হয়।

Ditionতিহ্যগতভাবে, মডেলগুলি এর মতো দেখতে পারে:

মন্তব্য মডেল:

class Comment < ActiveRecord::Base
  belongs_to :commentable, polymorphic: true
end

নিবন্ধ মডেল:

class Article < ActiveRecord::Base
  has_many :comments, as: :commentable 

  def find_first_comment
    comments.first(created_at DESC)
  end

  def self.least_commented
   #return the article with least number of comments
  end
end

ইভেন্ট মডেল

class Event < ActiveRecord::Base
  has_many :comments, as: :commentable 

  def find_first_comment
    comments.first(created_at DESC)
  end

  def self.least_commented
   #returns the event with least number of comments
  end
end

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

এর জন্য অ্যাপ / মডেল / উদ্বেগগুলিতে একটি মন্তব্যযোগ্য.rb ফাইল তৈরি করুন।

module Commentable
  extend ActiveSupport::Concern

  included do
    has_many :comments, as: :commentable
  end

  # for the given article/event returns the first comment
  def find_first_comment
    comments.first(created_at DESC)
  end

  module ClassMethods
    def least_commented
      #returns the article/event which has the least number of comments
    end
  end
end

এবং এখন আপনার মডেলগুলি দেখতে এইরকম:

মন্তব্য মডেল:

class Comment < ActiveRecord::Base
  belongs_to :commentable, polymorphic: true
end

নিবন্ধ মডেল:

class Article < ActiveRecord::Base
  include Commentable
end

ইভেন্ট মডেল:

class Event < ActiveRecord::Base
  include Commentable
end

2) স্কিন-নাইজিং ফ্যাট মডেলগুলি।

একটি ইভেন্টের মডেল বিবেচনা করুন। একটি ইভেন্টে অনেক উপস্থিতি এবং মন্তব্য রয়েছে।

সাধারণত, ইভেন্টের মডেলটি দেখতে এটির মতো হতে পারে

class Event < ActiveRecord::Base   
  has_many :comments
  has_many :attenders


  def find_first_comment
    # for the given article/event returns the first comment
  end

  def find_comments_with_word(word)
    # for the given event returns an array of comments which contain the given word
  end 

  def self.least_commented
    # finds the event which has the least number of comments
  end

  def self.most_attended
    # returns the event with most number of attendes
  end

  def has_attendee(attendee_id)
    # returns true if the event has the mentioned attendee
  end
end

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

উপরের মডেলটি নীচে হিসাবে উদ্বেগগুলি ব্যবহার করে রিফ্যাক্টর করা যেতে পারে: অ্যাপ / মডেল / উদ্বেগ / ইভেন্ট ফোল্ডারে একটি attendable.rbএবং commentable.rbফাইল তৈরি করুন

attendable.rb

module Attendable
  extend ActiveSupport::Concern

  included do 
    has_many :attenders
  end

  def has_attender(attender_id)
    # returns true if the event has the mentioned attendee
  end

  module ClassMethods
    def most_attended
      # returns the event with most number of attendes
    end
  end
end

commentable.rb

module Commentable
  extend ActiveSupport::Concern

  included do 
    has_many :comments
  end

  def find_first_comment
    # for the given article/event returns the first comment
  end

  def find_comments_with_word(word)
    # for the given event returns an array of comments which contain the given word
  end

  module ClassMethods
    def least_commented
      # finds the event which has the least number of comments
    end
  end
end

এবং এখন কনসার্ন ব্যবহার করে আপনার ইভেন্টের মডেলটি হ্রাস পেয়েছে

class Event < ActiveRecord::Base
  include Commentable
  include Attendable
end

* উদ্বেগগুলি ব্যবহার করার সময় 'প্রযুক্তিগত' গ্রুপিংয়ের পরিবর্তে 'ডোমেন' ভিত্তিক গ্রুপিংয়ের পরামর্শ দেওয়া উচিত। ডোমেন ভিত্তিক গোষ্ঠীকরণ 'মন্তব্যযোগ্য', 'ফটোটেবল', 'উপস্থিতিযোগ্য' এর মতো। প্রযুক্তিগত গোষ্ঠীকরণের অর্থ 'বৈধকরণমাথোডস', 'ফাইন্ডার ম্যাথডস' ইত্যাদি etc


6
সুতরাং উদ্বেগগুলি উত্তরাধিকার বা ইন্টারফেস বা একাধিক উত্তরাধিকার ব্যবহারের এক উপায়? একটি সাধারণ বেস শ্রেণি তৈরি করা এবং সেই সাধারণ বেস শ্রেণি থেকে সাবক্লাসিংয়ে কী ভুল?
ক্লো 0

3
প্রকৃতপক্ষে @ ক্লোই, আমি যেখানে কিছুটা লাল, একটি 'উদ্বেগ' ডিরেক্টরি সহ একটি রেলস অ্যাপ্লিকেশনটি আসলে একটি "উদ্বেগ" ...
জিয়ান জুনাইদিন

আপনার সমস্ত পদ্ধতি সংজ্ঞায়িত করতে আপনি 'অন্তর্ভুক্ত' ব্লকটি ব্যবহার করতে পারেন এবং এতে অন্তর্ভুক্ত রয়েছে: শ্রেণি পদ্ধতি (সহ def self.my_class_method), উদাহরণ পদ্ধতি এবং পদ্ধতি কল এবং নির্দেশিকা শ্রেণীর ক্ষেত্রের মধ্যে। দরকার নেইmodule ClassMethods
এ ফাদার অন্ধকার

1
আমার উদ্বেগের সাথে যে সমস্যাটি রয়েছে তা হ'ল তারা সরাসরি মডেলটিতে কার্যকারিতা যুক্ত করে। সুতরাং যদি দুটি উদ্বেগ উভয়ই বাস্তবায়িত করে add_item, উদাহরণস্বরূপ, আপনি খারাপ হয়ে গেছেন। আমার মনে আছে কিছু ভ্যালিডেটর কাজ করা বন্ধ করে দিলে কারা ভেঙে গেছে, তবে কেউ any?উদ্বেগের সাথে বাস্তবায়ন করেছিলেন। আমি একটি ভিন্ন সমাধানের প্রস্তাব দিচ্ছি: উদ্বেগটি কোনও ভিন্ন ভাষায় ইন্টারফেসের মতো ব্যবহার করুন। কার্যকারিতা সংজ্ঞায়িত করার পরিবর্তে, এটি পৃথক শ্রেণীর উদাহরণের জন্য রেফারেন্স সংজ্ঞায়িত করে যা সেই কার্যকারিতা পরিচালনা করে। তারপরে আপনার কাছে ছোট, সুন্দর ক্লাস রয়েছে যা একটি কাজ করে ...
এ ফাদার ডার্কলি

@ অাদিতি_জাইন: ভুল ধারণা এড়াতে দয়া করে ছোট পরিবর্তনটি সংশোধন করুন। মানে ওই "অ্যাপ্লিকেশন / মডেল / উদ্বেগ / ঘটনা ফোল্ডারে একটি attendable.rd এবং commentable.rb ফাইল তৈরি করুন" -> attendable.rd attendable.rb ধন্যবাদ হতে হয়েছে
Rubyist

96

এটি উল্লেখ করার মতো বিষয় যে উদ্বেগগুলি ব্যবহার করা অনেকেই খারাপ ধারণা বলে মনে করেন।

  1. এই ছেলে মত
  2. এবং এটি

কিছু কারণ:

  1. পর্দার আড়ালে কিছু অন্ধকার যাদু ঘটছে - কনসার্ন প্যাচিং includeপদ্ধতি, একটি সম্পূর্ণ নির্ভরতা হ্যান্ডলিং সিস্টেম রয়েছে - তুচ্ছ ভাল পুরানো রুবি মিক্সিন প্যাটার্ন এমন কোনও কিছুর জন্য খুব বেশি জটিলতা।
  2. আপনার ক্লাস কম শুষ্ক হয় না। আপনি যদি বিভিন্ন মডিউলে 50 টি পাবলিক পদ্ধতিগুলি স্টাফ করেন এবং সেগুলিকে অন্তর্ভুক্ত করেন তবে আপনার শ্রেণিতে এখনও 50 টি পাবলিক পদ্ধতি রয়েছে, আপনি কেবল সেই কোড গন্ধটি লুকিয়ে রাখেন, আপনার আবর্জনাকে ড্রয়ারে রেখে দিন।
  3. চারপাশের সমস্ত উদ্বেগের সাথে কোডবেস নেভিগেট করা আসলেই শক্ত।
  4. আপনি কি নিশ্চিত যে আপনার দলের সকল সদস্যের একই বোঝার আছে যা সত্যই উদ্বেগের বিকল্প হিসাবে নেওয়া উচিত?

উদ্বেগ হ'ল নিজেকে পায়ে গুলি করার সহজ উপায়, তাদের সাথে সতর্ক থাকুন।


1
আমি জানি এই আলোচনার জন্য এসও সবচেয়ে ভাল জায়গা নয়, তবে অন্য কোন ধরণের রুবি মিক্সিন আপনার ক্লাসগুলি শুষ্ক রাখে? আপনার যুক্তিগুলির # 1 এবং # 2 কারণগুলির মতো বলে মনে হচ্ছে, যদি না আপনি কেবল ওও ডিজাইনের জন্য, পরিষেবা স্তরকে, বা অন্য কোনও বিষয় মিস করছি না তবে? (আমি একমত নই - আমি বিকল্প যুক্ত করতে সাহায্য করার পরামর্শ দিচ্ছি!)
টোবুলকেহে

2
Github.com/AndyObtiva/super_module ব্যবহার করা একটি বিকল্প, ভাল পুরানো ClassMethods নিদর্শন ব্যবহার করা অন্য একটি। এবং পরিষ্কারভাবে আলাদা উদ্বেগের জন্য আরও অবজেক্ট (যেমন পরিষেবা) ব্যবহার করা অবশ্যই যাওয়ার উপায় is
ডাঃ স্ট্রেঞ্জলভ

4
ডাউনভোটিং কারণ এটি প্রশ্নের উত্তর নয়। এটি একটি মতামত। এটি একটি মতামত যে আমি নিশ্চিত যে এটির যোগ্যতা রয়েছে তবে এটি স্ট্যাকওভারফ্লোতে কোনও প্রশ্নের উত্তর হওয়া উচিত নয়।
আদম

2
@ অ্যাডাম এটি একটি মতামতযুক্ত উত্তর। কল্পনা করুন যে কেউ কীভাবে রেলের গ্লোবাল ভেরিয়েবলগুলি ব্যবহার করবেন জিজ্ঞাসা করবেন, অবশ্যই উল্লেখ করুন যে জিনিসগুলি করার আরও ভাল উপায় আছে (যেমন রেডিসকন্টেন্ট বনাম $ রেডিস) টপিক স্টার্টারটির জন্য দরকারী তথ্য হতে পারে? সফ্টওয়্যার ডেভলপমেন্ট সহজাতভাবে একটি মতামতযুক্ত শৃঙ্খলা, এটির আশেপাশে কোনও লাভ নেই। প্রকৃতপক্ষে, আমি জবাব এবং আলোচনা হিসাবে মতামত দেখতে পাই যা উত্তর উত্তর
স্ট্যাকওভারফ্লোতে সর্বকালের

2
অবশ্যই, আপনার প্রশ্নের উত্তর সহ এটি উল্লেখ করা ভাল মনে হয়। আপনার উত্তরের কিছুই আসলে ওপি-র প্রশ্নের উত্তর দেয় না। যদি আপনি যা করতে চান তা যদি কাউকে সতর্ক করে দেওয়া হয় যে কেন তারা উদ্বেগ বা বৈশ্বিক পরিবর্তনশীল ব্যবহার করবেন না তবে এটি একটি ভাল মন্তব্য করবে যে আপনি তাদের প্রশ্নের সাথে যুক্ত করতে পারেন, তবে এটি আসলে একটি উত্তরের জবাব দেয় না।
আদম

56

এই পোস্টটি আমাকে উদ্বেগগুলি বুঝতে সহায়তা করেছে।

# app/models/trader.rb
class Trader
  include Shared::Schedule
end

# app/models/concerns/shared/schedule.rb
module Shared::Schedule
  extend ActiveSupport::Concern
  ...
end

1
ইন্টারনেট সংরক্ষণাগার সংস্করণ: web.archive.org/web/20130712014326/http://blog.andywaite.com/…
এমজেডবি

1
এই উত্তর কিছুই ব্যাখ্যা দেয় না।

46

আমি এখানে বেশিরভাগ উদাহরণগুলি অনুধাবন করেছি যে moduleকীভাবে ActiveSupport::Concernমূল্যবোধ যুক্ত হয় তার চেয়ে শক্তি প্রদর্শন করে module

উদাহরণ 1: আরও পঠনযোগ্য মডিউল।

সুতরাং উদ্বেগ ছাড়াই এটি কীভাবে আদর্শ moduleহবে।

module M
  def self.included(base)
    base.extend ClassMethods
    base.class_eval do
      scope :disabled, -> { where(disabled: true) }
    end
  end

  def instance_method
    ...
  end

  module ClassMethods
    ...
  end
end

সঙ্গে রিফ্যাক্টরিং পরে ActiveSupport::Concern

require 'active_support/concern'

module M
  extend ActiveSupport::Concern

  included do
    scope :disabled, -> { where(disabled: true) }
  end

  class_methods do
    ...
  end

  def instance_method
    ...
  end
end

আপনি উদাহরণের পদ্ধতিগুলি, শ্রেণির পদ্ধতিগুলি এবং অন্তর্ভুক্ত ব্লকটি কম অগোছালো দেখুন। উদ্বেগগুলি এগুলি আপনার জন্য যথাযথভাবে ইনজেক্ট করবে। এটি ব্যবহারের এক সুবিধা ActiveSupport::Concern


উদাহরণ 2: মডিউল নির্ভরতা কৌতুকপূর্ণভাবে পরিচালনা করুন।

module Foo
  def self.included(base)
    base.class_eval do
      def self.method_injected_by_foo_to_host_klass
        ...
      end
    end
  end
end

module Bar
  def self.included(base)
    base.method_injected_by_foo_to_host_klass
  end
end

class Host
  include Foo # We need to include this dependency for Bar
  include Bar # Bar is the module that Host really needs
end

এই উদাহরণে Barমডিউলটি Hostসত্যই প্রয়োজন। কিন্তু যেহেতু Barসঙ্গে নির্ভরতা রয়েছে বর্গ আছে (কিন্তু অপেক্ষা করুন কেন সম্পর্কে জানতে চান ? এটা এড়ানো যায়?)।FooHostinclude FooHostFoo

সুতরাং Barযেখানেই যায় নির্ভরতা যুক্ত করে। এবং অন্তর্ভুক্তির ক্রমটিও এখানে গুরুত্বপূর্ণ। এটি বিশাল কোড বেসে অনেক জটিলতা / নির্ভরতা যুক্ত করে।

সঙ্গে রিফ্যাক্টরিং পরে ActiveSupport::Concern

require 'active_support/concern'

module Foo
  extend ActiveSupport::Concern
  included do
    def self.method_injected_by_foo_to_host_klass
      ...
    end
  end
end

module Bar
  extend ActiveSupport::Concern
  include Foo

  included do
    self.method_injected_by_foo_to_host_klass
  end
end

class Host
  include Bar # It works, now Bar takes care of its dependencies
end

এখন এটি সহজ দেখাচ্ছে।

আপনি যদি ভাবছেন তবে আমরা কেন মডিউলে Fooনির্ভরতা যুক্ত করতে পারি না Bar? যেহেতু ওটা কাজ করবে না method_injected_by_foo_to_host_klassআছে সহ এর কোন ক্লাসে ইনজেকশনের করা Barনা Barমডিউল নিজেই।

সূত্র: রেলস অ্যাক্টিভসপোর্ট :: কনসার্ন


তার জন্য ধন্যবাদ. তাদের উপকারটি কী তা আমি ভাবতে শুরু করেছিলাম ...
হরি করম সিংহ

FWIW এই মোটামুটিভাবে থেকে কপি-পেস্ট করা হয় ডক্স
ডেভ নিউটন

7

উদ্বেগের ক্ষেত্রে ফাইলের নাম। Rb করুন

উদাহরণস্বরূপ আমি আমার অ্যাপ্লিকেশনটিতে চাই যেখানে অ্যাট্রিবিউট ক্রিয়ে_বাই এর আপডেট রয়েছে সেখানে আপডেট মান 1, এবং আপডেট_বাইয়ের জন্য 0 রয়েছে

module TestConcern 
  extend ActiveSupport::Concern

  def checkattributes   
    if self.has_attribute?(:created_by)
      self.update_attributes(created_by: 1)
    end
    if self.has_attribute?(:updated_by)
      self.update_attributes(updated_by: 0)
    end
  end

end

আপনি যদি কর্মে তর্কগুলি পাস করতে চান

included do
   before_action only: [:create] do
     blaablaa(options)
   end
end

এর পরে আপনার মডেলটিতে এটি অন্তর্ভুক্ত করুন:

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