Próbuję przekonwertować nazwę z etui węża na etui na wielbłąda. Czy są jakieś wbudowane metody?
Np .: "app_user"
do"AppUser"
(Mam ciąg, "app_user"
który chcę przekonwertować na model AppUser
).
ruby-on-rails
ruby
string
Lohith MV
źródło
źródło
ruby-on-rails
, więc myślę, że to nie problem. Ale dzięki za wzmiankę.#classify
zamiast tego."some_namespace/module/class_name".classify => "SomeNamespace::Module::ClassName"
require "active_support/core_ext/string"
wystarczy pod warunkiem, że Railsy są już zainstalowane.A co z tym?
Znalezione w komentarzach tutaj: Klasyfikuj łańcuch Ruby
Zobacz komentarz Wayne Conrad
źródło
Jeśli używasz Railsów, użyj
classify
. Dobrze radzi sobie z krawędziami.Uwaga:
Ta odpowiedź jest specyficzna dla opisu podanego w pytaniu (nie jest specyficzna dla tytułu pytania). Jeśli ktoś próbuje zamienić sznurek na skrzynkę wielbłąda, powinien użyć odpowiedzi Sergio . Pytający stwierdza, że chce przejść
app_user
naAppUser
(nieApp_user
), stąd ta odpowiedź.źródło
classify
zwraca łańcuch, musiszconstantize
później wywołać, aby przekonwertować go na rzeczywistą klasę.classify
jest to, że ciągi w liczbie mnogiej staną się pojedyncze ...'age_in_years'.classify
staje sięAgeInYear
4.2.11
Źródło: http://rubydoc.info/gems/extlib/0.9.15/String#camel_case-instance_method
Do celów edukacyjnych:
A dla wariantu lowCase:
źródło
self.split('_').inject([]){ |buffer,e| buffer + [buffer.empty? ? e : e.capitalize] }.join
Benchmark dla czystych rozwiązań Ruby
Wykorzystałem wszystkie możliwości, jakie miałem na myśli, aby zrobić to za pomocą czystego kodu rubinowego, oto one:
wielkie litery i gsub
podziel i
&
mapuj używając skrótu (dzięki odpowiedzi użytkownika3869936)split i map (dzięki odpowiedzi pana Blacka)
A tutaj jest Benchmark dla wszystkich z nich, widzimy, że gsub jest do tego całkiem zły. Użyłem 126 080 słów.
źródło
Przyszedłem tutaj, szukając odwrotności twojego pytania, przechodząc od przypadku wielbłąda do przypadku węża. Użyj do tego podkreślenia (nie dekamelizuj):
AppUser.name.underscore # => "app_user"
lub, jeśli masz już ciąg wielbłąda:
"AppUser".underscore # => "app_user"
lub, jeśli chcesz uzyskać nazwę stołu, prawdopodobnie dlatego chciałbyś mieć etui węża:
AppUser.name.tableize # => "app_users"
źródło
AppUser.table_name
? Upewnij się również, że masz prawdziwą nazwę tabeli, jeśli nie jest to app_users, ale coś zdefiniowanego w innym miejscu.Czuję się trochę nieswojo, dodając tutaj więcej odpowiedzi. Zdecydowałem się na najbardziej czytelne i minimalne podejście do czystego rubinu, pomijając ładny wzorzec z @ ulysse-bn. Chociaż
:class
tryb jest kopią @ user3869936,:method
tryb, którego nie widzę w żadnej innej odpowiedzi tutaj.Wynik to:
źródło
PascalCase
są podzbioremCamelCase
. I to właśnie wiedziałem - ten przypadek wielbłąda dotyczył obu. Ale nigdy nie badałem. Dziękuję za wspomnienie PascalCase. en.wikipedia.org/wiki/Camel_case:method
wersja zrobiładowncase
pierwszą, więc można jej używać zarówno na, jaklower_snake_case
iUPPER_SNAKE_CASE
.Większość innych wymienionych tutaj metod jest specyficzna dla Railsów. Jeśli chcesz to zrobić z czystym Rubim, oto najbardziej zwięzły sposób, jaki wymyśliłem (dzięki @ ulysse-bn za sugerowane ulepszenie)
źródło
x.gsub(/(?:_|^)(\w)/){$1.upcase}
gsub
rozwiązania, które wydaje się wolniejsze w porównaniu domap
rozwiązania.Przedłuż ciąg, aby dodać Camelize
W czystym Rubim możesz rozszerzyć klasę stringów używając dokładnie tego samego kodu z Railsów
.camelize
źródło