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


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.