রুবিতে কোনও সামগ্রীর জন্য সমস্ত পদ্ধতি কীভাবে তালিকাভুক্ত করবেন?


112

একটি নির্দিষ্ট অবজেক্টের অ্যাক্সেস থাকা সমস্ত পদ্ধতিগুলিকে আমি কীভাবে তালিকাবদ্ধ করব?

@current_userঅ্যাপ্লিকেশন কন্ট্রোলারে সংজ্ঞায়িত আমার একটি অবজেক্ট রয়েছে:

def current_user
  @current_user ||= User.find(session[:user_id]) if session[:user_id]
end

এবং ভিউ ফাইলটিতে আমার কাছে কী কী পদ্ধতি উপলব্ধ রয়েছে তা দেখতে চাই। বিশেষত, আমি দেখতে চাই একটি :has_manyসমিতি কী কী পদ্ধতি সরবরাহ করে। (কী কী সরবরাহ করা :has_many উচিত তা আমি জানি তবে এটি পরীক্ষা করতে চাই))


স্পষ্ট করার জন্য, আপনি পদ্ধতিগুলি কল করতে চান @current_user?
অ্যান্ড্রু মার্শাল

@ ডার্ক, স্ট্যাকওভারফ্লোতে স্বাগতম! আপনার প্রশ্নের উত্তরের উত্তরটি "পরীক্ষা" করতে ভুলবেন না। যে কোনও প্রশ্নের, যে কোনও প্রশ্নের উত্তর, আপনি কার্যকর / সহায়ক বলে মনে করেন v
ল্যারি কে

উত্তর:


210

নীচে ব্যবহারকারী শ্রেণীর যে পদ্ধতিগুলি বেস অবজেক্ট শ্রেণিতে নেই তা তালিকাভুক্ত করবে ...

>> User.methods - Object.methods
=> ["field_types", "maximum", "create!", "active_connections", "to_dropdown",
    "content_columns", "su_pw?", "default_timezone", "encode_quoted_value", 
    "reloadable?", "update", "reset_sequence_name", "default_timezone=", 
    "validate_find_options", "find_on_conditions_without_deprecation", 
    "validates_size_of", "execute_simple_calculation", "attr_protected", 
    "reflections", "table_name_prefix", ...

নোট এটি methodsক্লাস এবং ক্লাসের উদাহরণগুলির জন্য একটি পদ্ধতি।

আমার ব্যবহারকারী শ্রেণীর যে পদ্ধতিগুলি অ্যাক্টিভেকর্ড বেস শ্রেণিতে নেই তা এখানে রয়েছে:

>> User.methods - ActiveRecord::Base.methods
=> ["field_types", "su_pw?", "set_login_attr", "create_user_and_conf_user", 
    "original_table_name", "field_type", "authenticate", "set_default_order",
    "id_name?", "id_name_column", "original_locking_column", "default_order",
    "subclass_associations",  ... 
# I ran the statements in the console.

নোট করুন যে ব্যবহারকারী শ্রেণিতে সংজ্ঞায়িত (অনেক) has_many সম্পর্কের ফলাফল হিসাবে তৈরি পদ্ধতিগুলি কলের ফলাফল নয়methods

যুক্ত নোট যে: has_many সরাসরি পদ্ধতি যুক্ত করে না। পরিবর্তে, অ্যাক্টিভেকর্ড যন্ত্রপাতি রুবি method_missingএবং ফ্লাইগুলিতে responds_toপদ্ধতি কলগুলি পরিচালনা করতে কৌশলগুলি ব্যবহার করে । ফলস্বরূপ, পদ্ধতির ফলাফলের ফলাফলগুলি তালিকাভুক্ত নয় methods


2
যদিও এটি সম্পূর্ণ নাও হতে পারে যেহেতু কিছু পদ্ধতি কেবল তখনই তৈরি করা হয় যখন মেথড_মিসিং বলা হয় (যেমন ডায়নামিক সন্ধানক)
ফ্রেডেরিক চিউং

আমি যদি উত্তর দেওয়ার চেষ্টা করি? আমি একটি পদ্ধতি অনুপস্থিত ত্রুটি পেয়েছি। আমি এই অ্যাপ্লিকেশনের ভিতরে চালাচ্ছি
html.erb

@ ডার্ক - সম্ভবত পদ্ধতিটি উপস্থিত নেই ... আমি আপনাকে একটি নতুন প্রশ্ন ফাইল করার পরামর্শ দিচ্ছি যেখানে আপনি আপনার এআর ক্লাসের সংজ্ঞাগুলি কী তা দেখান এবং তারপরে আপনার মনে হয় এমন নির্দিষ্ট পদ্ধতিগুলি সম্পর্কে জিজ্ঞাসা করুন: has_many সরবরাহ করা উচিত। এছাড়াও আপনার কি ম্যাচিং রয়েছে: যার_তো? এআর এর জন্য কারাগারের পুঁজি এবং বহুত্বকরণের নিয়ম অনেক পথভ্রষ্ট করেছিল ...
ল্যারি কে

@Larry। ধন্যবাদ - আমি .to_yaml এর সাথে একটি তালিকা পেতে পারি। দেখে মনে হচ্ছে এটি: --- -: স্কেচগুলি:: স্কেচ_আইডিস:: স্কেচ = -: স্কেচ_আইডি = -: আগে_আড্ড_ফর_সকেটস:: আগে_আড্ড_ফোর_ স্কেচ? <অনেকগুলি বাদ দেওয়া হয়েছে ........ আমি কীভাবে এই পদ্ধতিগুলিতে অ্যাক্সেস করব? (ডকুমেন্টেশনের প্রতি আমাকে ইঙ্গিত করে প্রশংসাও করেছেন :)
ডিস্ক

এর জন্য দস্তাবেজগুলি : has_many যুক্ত করা অনেকগুলি পদ্ধতি দেখায়। অন্যান্যগুলি রেলের পরবর্তী সংস্করণগুলির জন্য নতুন। এর মধ্যে রয়েছে "পূর্ববর্তী_এডি_ফোর্স" ইত্যাদি They এগুলি "সমিতি কলব্যাকস" - এই নথির
ল্যারি কে

9

মডিউল # instance_methods

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

module A
  def method1()  end
end
class B
  def method2()  end
end
class C < B
  def method3()  end
end

A.instance_methods                #=> [:method1]
B.instance_methods(false)         #=> [:method2]
C.instance_methods(false)         #=> [:method3]
C.instance_methods(true).length   #=> 43

6

বা কেবল User.methods(false)সেই শ্রেণীর মধ্যে সংজ্ঞায়িত পদ্ধতিগুলিই ফিরিয়ে দিতে।





1

@ ক্লাইফের উত্তরটি ব্যাখ্যা করতে। আপনি নিম্নলিখিত কোডটি ব্যবহার করে আপনার উদাহরণ পদ্ধতির একটি তালিকা পেতে পারেন (ধরে নিবেন যে "পার্সার" নামে আপনার কোনও অবজেক্ট ক্লাস রয়েছে):

Parser.new.methods - Object.new.methods

1

আপনি যদি এমন পদ্ধতির তালিকা খুঁজছেন যা কোনও দৃষ্টিকোণ দ্বারা প্রতিক্রিয়া জানায় (আপনার ক্ষেত্রে @ বর্তমান_উজার)। রুবি ডকুমেন্টেশন পদ্ধতি অনুসারে

প্রকাশ্য ও সুরক্ষিত পদ্ধতিগুলির নামগুলির একটি তালিকা ফেরত দেয়। এটিতে পূর্বপুরুষদের অ্যাক্সেসযোগ্য সমস্ত পদ্ধতি অন্তর্ভুক্ত করা হবে। যদি alচ্ছিক প্যারামিটারটি মিথ্যা হয় তবে এটি অবজেক্টের সর্বজনীন এবং সুরক্ষিত সিঙ্গলটন পদ্ধতিগুলির একটি অ্যারে প্রদান করে, অ্যারেটি অবজেক্টে অন্তর্ভুক্ত মডিউলগুলির পদ্ধতিগুলিকে অন্তর্ভুক্ত করবে না।

@current_user.methods
@current_user.methods(false) #only public and protected singleton methods and also array will not include methods in modules included in @current_user class or parent of it.

বিকল্পভাবে, আপনি এটিও পরীক্ষা করতে পারেন যে কোনও পদ্ধতি কোনও জিনিসে কলযোগ্য কিনা?

@current_user.respond_to?:your_method_name

আপনি যদি পিতামাত্ত শ্রেণীর পদ্ধতিগুলি না চান তবে কেবল এটি থেকে পিতৃত শ্রেণীর পদ্ধতিগুলি বিয়োগ করুন।

@current_user.methods - @current_user.class.superclass.new.methods #methods that are available to @current_user instance.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.