রেলস: কন্ট্রোলার শ্রেণির নামের উপর ভিত্তি করে মডেল শ্রেণীর নাম কীভাবে পাবেন?


উত্তর:


190

এটি এটি করবে:

class HouseBuyersController < ApplicationController

  def index
    @model_name = controller_name.classify
  end

end

নিয়ন্ত্রক ক্রিয়াকলাপ বিমূর্ত করার সময় এটি প্রায়শই প্রয়োজন:

class HouseBuyersController < ApplicationController

  def index
    # Equivalent of @house_buyers = HouseBuyer.find(:all)
    objects = controller_name.classify.constantize.find(:all)
    instance_variable_set("@#{controller_name}", objects)
  end

end

@ মডেল_নাম = কন্ট্রোলার_নাম ক্লাসিফাই # হাউসবায়ার্স "ধন্যবাদ" ফেরত দেয়!
পিটার এহরিলিচ

4
অ্যাক্টিভসপোর্ট: ইনফ্লেক্টর দুর্দান্ত
জারেড বেক

আপনার প্রয়োজনের উপর নির্ভর করে (এই প্রশ্নটি কোনও বিবরণ নির্দিষ্ট করে না), আপনি controller_name.sub('_', ' ').titleize"হাউস বায়ার্স" পেতে পারেন can
ব্যবহারকারী 664833

যুক্তিটি (মডেল ক্লাস পাওয়ার জন্য) একটি পৃথক ইউটিলিটি পদ্ধতিতে স্থানান্তর করা ভাল হতে পারে। এমনকি অ্যাক্সেস গতি বাড়ানোর জন্য যদি ফলাফলটি ধ্রুবক হিসাবে সংরক্ষণ করা হয় তবে আরও ভাল। আপনি new.controller_name.classify.constantizeক্লাস সংজ্ঞা ব্যবহার করতে পারেন ।
কেলভিন

আমি মনে করি এটি লক্ষ করার মতো যে এটি প্রয়োগকারী নিয়ামকটিতে এটি নিয়ন্ত্রণ করবে যা নির্ভর করে যে এটি থেকে কোন নিয়ামক উত্তরাধিকার সূত্রে প্রাপ্ত।
ওয়েলটশ্মার্জ

40

যদি আপনার নিয়ামক এবং মডেল একই নামের জায়গায় থাকে তবে আপনি যা চান তা তা

controller_path.classify

controller_pathআপনাকে নাম স্থান দেয়; controller_nameনা।

উদাহরণস্বরূপ, যদি আপনার নিয়ামক হয়

Admin::RolesController

তারপরে:

controller_path.classify # "Admin::Role" # CORRECT
controller_name.classify # "Role"        # INCORRECT

6

এটি কিছুটা হ্যাক, তবে যদি আপনার মডেলটির নামটি আপনার নিয়ামকের নাম অনুসারে হয়:

class HouseBuyersController < ApplicationController
  def my_method
    @model_name = self.class.name.sub("Controller", "").singularize
  end
end

... আপনার @ মডেল_নামের ইনসেন্ট ভেরিয়েবলে আপনাকে "হাউসবায়ার" দেবে।

আবার, এটি একটি বিশাল ধারণা তৈরি করে যে "হাউসবায়ারস কন্ট্রোলার" কেবল "হাউসবায়ার" মডেলগুলির সাথে আলোচনা করে।


4

নেমস্পেসগুলি কাজ করার জন্য:

def resource_class
 controller_path.classify.constantize
end

0

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

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

def index
  @posts = Post.all
  @posts = Article.all
end  

রেল স্ট্যান্ডার্ড কন্ট্রোলারগুলিতে মডেলটি কী তা জানার উপায় নেই।


0

আমার নিয়ামক এবং মডেলটি নামগতির হওয়ায় গৃহীত সমাধানটি আমার পক্ষে কার্যকর হয়নি। পরিবর্তে, আমি নিম্নলিখিত পদ্ধতি নিয়ে এসেছি:

def controllers_model
  (self.class.name.split('::')[0..-2] << controller_name.classify).join('::')
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.