Saya menggunakan pernyataan IF di Ruby on Rails untuk mencoba dan menguji apakah parameter permintaan ditetapkan. Terlepas dari apakah kedua parameter ditetapkan atau tidak, bagian pertama berikut ini jika blok dipicu. Bagaimana saya bisa membuat bagian ini HANYA dipicu jika kedua params [: satu] dan params [: dua] diatur?
if (defined? params[:one]) && (defined? params[:two])
... do something ...
elsif (defined? params[:one])
... do something ...
end
ruby-on-rails
ruby
Darren
sumber
sumber
params
ini adalah metode pengendali Rails (yang terjadi untuk mengembalikan HashWithIndifferentAccess), ini adalah tentang Rails.Jawaban:
Anda ingin
has_key?
:Hanya memeriksa
if(params[:one])
akan tertipu oleh nilai "di sana tetapi nihil" dan "di sana tetapi salah" dan Anda bertanya tentang keberadaan. Anda mungkin perlu membedakan:nil
.false
.demikian juga. Sulit dikatakan tanpa detail lebih banyak tentang situasi Anda yang sebenarnya.
sumber
nil
parameter. Jika parameter ada, itu akan menjadi string kosong.params
belum diproses sebelum kita sampai di tempat kami memeriksa apa yang ada di dalamnya. Oleh karena itu daftar kemungkinan kasus khusus untuk diperiksa. Terbaik untuk mengatakan apa yang Anda maksud IMHO.key?
metode. edgeapi.rubyonrails.org/classes/ActionController/…params.to_h.key?
untuk saat ini.Saya penggemar
params[:one].present?
Hanya karena menyimpan
params[sym]
formulir sehingga lebih mudah dibaca.sumber
has_key
alih-alih memberi Anda apa yang Anda cari.gunakan kosong? http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
akan mengembalikan true jika kosong atau nol
juga ... itu tidak akan berfungsi jika Anda menguji nilai boolean .. sejak
dalam hal ini Anda bisa menggunakan
sumber
present?
yang mengembalikan kebalikan dariblank?
. Jadi Anda bisa mengubahnyaunless
menjadiif
jika Anda mau.unless
tidak apa-apa. Tapi ya, saya lebih sukaif
denganpresent?
Anda dapat menulisnya dengan lebih ringkas seperti berikut:
sumber
Sederhana seperti pai:
sumber
sumber
Cara yang sangat sederhana untuk memberikan nilai default ke params Anda:
params[:foo] ||= 'default value'
sumber
params.fetch(:foo, 'default value')
terlaluSaya baru saja membaca ini di kelas RubyInRails http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
Anda dapat menggunakan
blank?
metode yang setara denganparams[:one].nil? || params[:one].empty?
(misalnya)
sumber
params[:one].nil? || params[:one].empty?
Anda juga dapat melakukan hal berikut:
Saya cenderung menggunakan solusi di atas ketika saya ingin memeriksa lebih dari satu atau dua params.
.values_at kembali dan array dengan nihil menggantikan kunci param yang tidak terdefinisi. yaitu:
akan mengembalikan yang berikut:
.includes? (nil) lalu periksa array untuk nilai nil. Ini akan mengembalikan true adalah array termasuk nil.
Dalam beberapa kasus, Anda mungkin juga ingin memeriksa bahwa params tidak mengandung dan mengosongkan string pada nilai yang salah.
Anda dapat menangani nilai-nilai itu dengan menambahkan kode berikut di atas pernyataan kecuali.
semuanya akan terlihat seperti ini:
Penting untuk dicatat bahwa delete_if akan memodifikasi hash / params Anda, jadi gunakan dengan hati-hati.
Solusi di atas jelas membutuhkan sedikit lebih banyak pekerjaan untuk diatur tetapi sepadan jika Anda memeriksa lebih dari satu atau dua params saja.
sumber
Selain jawaban sebelumnya:
has_key?
danhas_value?
memiliki alternatif yang lebih pendek dalam bentukkey?
danvalue?
. Tim Ruby juga menyarankan untuk menggunakan alternatif yang lebih pendek, tetapi untuk keterbacaan beberapa mungkin masih lebih suka versi yang lebih panjang dari metode ini.Karena itu dalam kasus Anda itu akan menjadi seperti
NB!
.key?
hanya akan memeriksa apakah kunci ada dan mengabaikan nilai apa pun yang mungkin. Misalnya:sumber
Inilah yang saya lakukan,
dan kemudian metode berikut:
sumber
Hanya menyatukan ini untuk masalah yang sama:
baris pertama memeriksa apakah kunci target kami ada di kunci params menggunakan <= subset? operator. Enumerable.all? tanpa blok per default mengembalikan false jika ada nilai nil atau salah.
sumber
Anda juga dapat memeriksa apakah parameternya kosong dengan menggunakan params [: two] .empty
sumber
Saya mencoba yang terlambat, tetapi dari pandangan jauh jawaban:
Jika Anda ingin tahu apakah nilai dalam hash (apa saja) ditetapkan, semua jawaban di atas benar, tergantung dari sudut pandang mereka.
Jika Anda ingin menguji (GET / POST ..) params Anda, Anda harus menggunakan sesuatu yang lebih khusus untuk apa yang Anda harapkan menjadi nilai
params[:one]
, sesuatu sepertimengabaikan parameter (GET / POST) seolah-olah mereka di mana tidak diatur, jika mereka tidak sesuai seperti yang diharapkan
hanya
if params[:one]
dengan atau tanpa deteksi nil / benar adalah satu langkah untuk membuka halaman Anda untuk peretasan, karena, biasanya langkah berikutnya untuk menggunakan sesuatu sepertiselect ... where params[:one] ...
, apakah ini dimaksudkan atau tidak, aktif atau di dalam atau setelah kerangka kerja.jawaban atau hanya sebuah petunjuk
sumber