Saya mencoba membuat Rails memanfaatkan karakter pertama string, dan membiarkan yang lainnya apa adanya. Saya mengalami masalah saat "saya dari New York" diubah menjadi "Saya dari new york."
Metode apa yang akan saya gunakan untuk memilih karakter pertama?
Terima kasih
EDIT: Saya mencoba menerapkan apa yang disarankan macek, tetapi saya mendapatkan kesalahan "metode tidak terdefinisi" memanfaatkan " . Kode berfungsi dengan baik tanpa garis huruf kapital. Terima kasih untuk bantuannya!
def fixlistname!
self.title = self.title.lstrip + (title.ends_with?("...") ? "" : "...")
self.title[0] = self.title[0].capitalize
errors.add_to_base("Title must start with \"You know you...\"") unless self.title.starts_with? 'You know you'
end
EDIT 2: Berhasil. Terima kasih untuk bantuannya!
EDIT 3: Tunggu, tidak, saya tidak ... Inilah yang saya miliki dalam model daftar saya.
def fixlistname!
self.title = self.title.lstrip + (title.ends_with?("...") ? "" : "...")
self.title.slice(0,1).capitalize + self.title.slice(1..-1)
errors.add_to_base("Title must start with \"You know you...\"") unless self.title.starts_with? 'You know you'
end
EDIT 4: Mencoba edit macek, dan masih mendapatkan kesalahan metode `` capitalize '"yang tidak ditentukan . Apa yang mungkin saya lakukan salah?
def fixlistname!
self.title = title.lstrip
self.title += '...' unless title.ends_with?('...')
self.title[0] = title[0].capitalize
errors.add_to_base('Title must start with "You know you..."') unless title.starts_with?("You know you")
end
EDIT 5: Ini aneh. Saya dapat menyingkirkan kesalahan metode tidak ditentukan dengan menggunakan baris di bawah ini. Masalahnya adalah sepertinya mengganti huruf pertama dengan angka. Misalnya, alih-alih menggunakan huruf besar y pada Anda , ini mengubah y menjadi 121
self.title[0] = title[0].to_s.capitalize
sumber
EDIT 3
, Anda harus memulai baris 2 denganself.title =
. Juga, pada semua 3 baris, Anda hanya perluself.title
di sebelah kiri=
(tanda sama dengan). Di tempat lain Anda bisa menggunakantitle
. Lihat edit jawaban saya sebagai contoh.Jawaban:
Titleize akan menggunakan huruf besar setiap kata. Kalimat ini terasa berat, tapi akan menjamin bahwa satu-satunya surat yang diubah adalah yang pertama.
Memperbarui:
sumber
s[0].capitalize + s[1..-1] if s.present?
Ini harus melakukannya:
sumber
title[0] = title[0].capitalize
title.first.capitalize!
capitalize
mengonversi semua huruf setelah huruf pertama menjadi huruf kecil, jadi ini tidak berfungsi untuk string yang disajikan dalam pertanyaan ("Saya dari New York").Anda bisa menggunakan memanusiakan. Jika Anda tidak membutuhkan garis bawah atau huruf besar lainnya di baris teks Anda.
Memasukkan:
Keluaran:
sumber
humanize
adalah Rails, tepatnya metode ActiveSupport. Ruby biasa tidak bisa melakukan itu.sumber
^
berarti permulaan baris,"\nfoo"
menjadi"\nFoo"
. Itu mungkin bagus untuk sebagian besar kasus penggunaan. Karena ini asub
dan bukan agsub
, itu masih hanya akan memperbesar satu huruf, bahkan dengan string multiline.str.sub(/\S/, &:upcase)
, yang akan mencari karakter non-spasi pertama dan memperbesarnya.Pada Rails 5.0.0.beta4 Anda dapat menggunakan
String#upcase_first
metode baru atauActiveSupport::Inflector#upcase_first
melakukannya. Periksa posting blog ini untuk info lebih lanjut.sumber
Solusi berorientasi objek:
Maka Anda bisa melakukan ini:
sumber
String
kelas.sumber
Edit 2
Saya tidak bisa meniru masalah Anda. Lanjutkan dan jalankan skrip Ruby asli ini. Ini menghasilkan keluaran tepat yang Anda cari, dan Rails mendukung semua metode ini. Jenis masukan apa yang bermasalah?
keluaran
Edit
Berdasarkan hasil edit Anda, Anda dapat mencoba sesuatu seperti ini.
Asli
Ini akan berhasil
Ketika mencoba menggunakan
String#capitalize
seluruh string, Anda melihatI'm from new york
karena metode:sumber
sumber
Sebagian besar jawaban ini mengedit string pada tempatnya, saat Anda hanya memformat untuk keluaran tampilan, Anda mungkin tidak ingin mengubah string yang mendasari sehingga Anda dapat menggunakan
tap
setelah adup
untuk mendapatkan salinan yang dieditsumber
Jika dan hanya jika OP ingin melakukan monkey patching pada objek String, maka ini dapat digunakan
Sekarang gunakan:
sumber
Versi yang lebih pendek bisa jadi:
sumber
Tidak ada yang menyebutkan gsub, yang memungkinkan Anda melakukan ini secara ringkas.
Contoh:
sumber
Mungkin cara termudah.
sumber
Perhatikan bahwa jika Anda perlu berurusan dengan karakter multi-byte, misalnya jika Anda harus menginternasionalkan situs Anda,
s[0] = ...
solusinya tidak akan cukup. Pertanyaan Stack Overflow ini menyarankan penggunaan gem unicode-utilRuby 1.9: Bagaimana saya bisa melakukan upcase & downcase multibyte string dengan benar?
EDIT
Sebenarnya cara yang lebih mudah untuk setidaknya menghindari pengkodean string yang aneh adalah dengan hanya menggunakan String # mb_chars :
sumber
Bagaimana dengan metode klasifikasi pada string?
keluaran:
sumber
"hello worlds".classify # => "Hello world"
sumber
string[i]
tidak berfungsi dalam bahasa lain. Harap bantu agar StackOverflow bebas dari jenis jawaban yang diretas ini. Kita tidak bisa mengatakan RTFM, tetapi bahkan cepat melirikString
docs akan telah membantu menghindari jawaban seperti ini ...