আমি কীভাবে কোনও রুবি শ্রেণির নামকে আন্ডারস্কোর-সীমাবদ্ধ প্রতীক হিসাবে রূপান্তর করব?


99

আমি কীভাবে প্রোগ্রামে কোনও শ্রেণীর নামকে, FooBarএকটি প্রতীক হিসাবে রূপান্তর করতে পারি :foo_bar? উদাহরণস্বরূপ এই জাতীয় কিছু, কিন্তু উটের কেসটি সঠিকভাবে পরিচালনা করে?

FooBar.to_s.downcase.to_sym

উত্তর:


145

রেলগুলি এমন একটি পদ্ধতি নিয়ে আসে underscoreযা আপনাকে ক্যামেলকেসড স্ট্রিংগুলিকে আন্ডারস্কোর_সামান্য স্ট্রিংগুলিতে রূপান্তর করতে দেয়। সুতরাং আপনি এটি করতে সক্ষম হতে পারে:

FooBar.name.underscore.to_sym

আইপসাম যেমন বলে ঠিক তেমনটি করার জন্য আপনাকে অ্যাক্টিভসপোর্টটি ইনস্টল করতে হবে।

আপনি যদি কেবল তার জন্য অ্যাক্টিভসপোর্টটি ইনস্টল করতে না চান তবে আপনি নিজের underscoreমধ্যে বানর-প্যাচ করতে পারেন String(আন্ডারস্কোর ফাংশনটি অ্যাক্টিভসপোর্ট :: ইনফ্ল্যাক্টারে সংজ্ঞায়িত হয়েছে ):

class String
  def underscore
    word = self.dup
    word.gsub!(/::/, '/')
    word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
    word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
    word.tr!("-", "_")
    word.downcase!
    word
  end
end

4
ধন্যবাদ আমি ভয় পেয়েছিলাম যে এটি একটি রেল এক্সটেনশন। :) কোনও উদ্বেগ নেই, কারণ আমি প্রকৃতপক্ষে রেলগুলি ব্যবহার করছি।
— জোশ গ্লোভার

4
তারপরে আপনার সেই অনুযায়ী আপনার প্রশ্নটি ট্যাগ করা উচিত ছিল। এখানে, আমি আপনার জন্য এটি করতে দিন ...
— কিকিতো

5
না, অ্যাক্টিভেকর্ড নয়। অ্যাক্টিভসপোর্ট
— রেন হেনরিচস

আসলে, আমাকে এটি পরিবর্তন করতে দিন
— কিকিতো

4
বিপরীতটি কীভাবে করবেন?
— ব্যবহারকারী1406062

73

রেল 4 .model_name

রেলস 4 এ এটি ActiveModel::Nameএমন একটি বস্তু প্রদান করে যার মধ্যে আরও অনেক দরকারী "শব্দার্থক" বৈশিষ্ট্য রয়েছে যেমন:

FooBar.model_name.param_key
#=> "foo_bar"

FooBar.model_name.route_key
#=> "foo_bars"

FooBar.model_name.human
#=> "Foo bar"

সুতরাং আপনার যদি তাদের পছন্দসই অর্থের সাথে মেলে তবে তাদের মধ্যে একটি ব্যবহার করা উচিত, সম্ভবত এটিই সম্ভব। সুবিধাদি:

  • আপনার কোড বুঝতে সহজ
  • আপনার অ্যাপ্লিকেশন এখনও (সম্ভাব্য) ইভেন্টে কাজ করবে যা রেইল একটি নামকরণ কনভেনশন পরিবর্তন করার সিদ্ধান্ত নিয়েছে।

BTW, humani18n সচেতন হচ্ছে সুবিধা আছে।


model_nameউদাহরণস্বরূপ বস্তুর জন্যও কাজ করে। উদা: foo_bar.model_name। আপনি যদি পুরো তালিকাটি foo_bar.model_name.inspectরেল কনসোল বা আপনার ডিবাগারে লিখতে চান
— ivanxuu

এবং আমি বিপরীত খুঁজছেন ছিল / বিপরীত, classify, modelizeকাজ বলে মনে হচ্ছে নি।
— পিসিস

7

প্রথম: মণি ইনস্টল সক্রিয় সমর্থন

require 'rubygems'
require 'active_support'
"FooBar".underscore.to_sym

হওয়া উচিত FooBar.to_s.underscore.to_sym, যেহেতু আমি একটি ক্লাসকে (যা একটি ধ্রুবক) একটি প্রতীক হিসাবে রূপান্তর করার চেষ্টা করছি, যা আমি তখন ফ্যাক্টরি গার্লকে খাওয়াতে পারি । :)
— জোশ গ্লোভার

2

আমি যা চেয়েছিলাম তা এখানে:

module MyModule
  module ClassMethods
    def class_to_sym  
      name_without_namespace = name.split("::").last
      name_without_namespace.gsub(/([^\^])([A-Z])/,'\1_\2').downcase.to_sym
    end
  end

  def self.included(base)
    base.extend(ClassMethods)
  end
end

class ThisIsMyClass
  include MyModule
end 

ThisIsMyClass.class_to_sym #:this_is_my_class

4
অ্যাক্টিভসপোর্টে String#demodulizeযা অংশটি আগে সরিয়ে ফেলবে ::।
— অ্যামিবি

@ আমোবে - তথ্যের জন্য ধন্যবাদ আপনার কী কাজ করছে তার উপর নির্ভর করে - আপনি কোনও রেল অ্যাপ্লিকেশন (বা একটি ওয়েব অ্যাপ্লিকেশন) এও কাজ করছেন না।
— লুই সায়ারস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.