Как проверить, существуют ли параметры в рельсах - PullRequest
172 голосов
/ 12 апреля 2011

Я использую оператор IF в Ruby on Rails, чтобы попытаться проверить, установлены ли параметры запроса.Независимо от того, установлены оба параметра или нет, первая часть следующего, если блок срабатывает.Как я могу заставить эту часть запускаться ТОЛЬКО, если установлены оба параметра [: one] и params [: two]?

if (defined? params[:one]) && (defined? params[:two])
 ... do something ...
elsif (defined? params[:one])
 ... do something ...
end

Ответы [ 14 ]

326 голосов
/ 12 апреля 2011

Вы хотите has_key?:

if(params.has_key?(:one) && params.has_key?(:two))

Просто проверка if(params[:one]) будет введена в заблуждение значением "там, но ноль" и "там, но ложь", и вы спрашиваете о существовании. Возможно, вам придется дифференцировать:

  • Там вообще нет.
  • Там, но nil.
  • Там, но false.
  • Там только пустая строка.

также. Трудно сказать без подробностей вашей точной ситуации.

81 голосов
/ 08 ноября 2013

Я фанат

params[:one].present?

Просто потому, что он сохраняет форму params[sym], поэтому его легче читать.

21 голосов
/ 10 декабря 2011

использовать пробел? http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F

unless params[:one].blank? && params[:two].blank?

вернет true, если оно пустое или ноль

также ... это не будет работать, если вы тестируете логические значения .., так как

>> false.blank?
=> true

в этом случае вы можете использовать

unless params[:one].to_s.blank? && params[:two].to_s.blank?
13 голосов
/ 20 января 2015

Вы можете написать это более кратко, как показано ниже:

required = [:one, :two, :three]
if required.all? {|k| params.has_key? k}
  # here you know params has all the keys defined in required array
else
  ...
end
9 голосов
/ 12 апреля 2011

Простой как пирог:

if !params[:one].nil? and !params[:two].nil?
  #do something...
elsif !params[:one].nil?
  #do something else...
elsif !params[:two].nil?
  #do something extraordinary...
end
5 голосов
/ 01 июня 2015

Я только что прочитал это на классах RubyInRails http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F

Вы можете использовать blank? метод, который эквивалентен params[:one].nil? || params[:one].empty?

(например)

if params[:one].blank? 
  # do something if not exist
else
  # do something if exist
end
5 голосов
/ 02 июня 2012

Очень простой способ предоставить значения по умолчанию вашим параметрам: params[:foo] ||= 'default value'

5 голосов
/ 12 апреля 2011
if params[:one] && params[:two]
 ... do something ...
elsif params[:one]
 ... do something ...
end
3 голосов
/ 29 июня 2017

В дополнение к предыдущим ответам: has_key? и has_value? имеют более короткие альтернативы в форме key? и value?.Команда Ruby также предлагает , используя более короткие альтернативы, но для удобочитаемости некоторые могут по-прежнему предпочитать более длинные версии этих методов.

Поэтому в вашем случае это будет что-то вроде

if params.key?(:one) && params.key?(:two)
  ... do something ...
elsif params.key?(:one)
  ... do something ...
end

NB!.key? просто проверит, существует ли ключ, и проигнорирует любое возможное значение.Например:

2.3.3 :016 > a = {first: 1, second: nil, third: ''}
  => {:first=>1, :second=>nil, :third=>""}
2.3.3 :017 > puts "#{a.key?(:first)}, #{a.key?(:second)}, #{a.key?(:third), #{a.key?(:fourth)}}"
true, true, true, false
3 голосов
/ 29 мая 2014

Вы также можете сделать следующее:

unless params.values_at(:one, :two, :three, :four).includes?(nil)
 ... excute code ..
end 

Я склонен использовать вышеупомянутое решение, когда хочу проверить более одного или двух параметров.

.values_at возвращает и массив с nil вместо любого неопределенного ключа param.то есть:

some_hash = {x:3, y:5}
some_hash.values_at(:x, :random, :y}

вернет следующее:

[3,nil,5] 

.include? (nil), а затем проверяет массив на наличие значений nil.Он вернет истину, если массив содержит ноль.

В некоторых случаях вы также можете проверить, что параметры не содержат, и пустую строку в значении false.

Вы можете обработать эти значения, добавив следующий код над оператором exc.

params.delete_if{|key,value| value.blank?}

все вместе это будет выглядеть так:

 params.delete_if{|key,value| value.blank?}
 unless params.values_at(:one, :two, :three, :four).includes?(nil)
   ... excute code ..
  end

Важно отметить, что delete_if изменит ваши хеш / параметры, поэтому используйте с осторожностью.

Приведенное выше решение явно требует немного больше усилий для настройки, но оно того стоит, если вы проверяете больше, чем один или два параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...