Я использую оператор IF в Ruby on Rails, чтобы попытаться проверить, установлены ли параметры запроса. Независимо от того, установлены оба параметра или нет, первая часть следующего, если блок срабатывает. Как я могу заставить эту часть запускаться ТОЛЬКО, если установлены оба параметра [: one] и params [: two]?
if (defined? params[:one]) && (defined? params[:two])
... do something ...
elsif (defined? params[:one])
... do something ...
end
ruby-on-rails
ruby
Даррен
источник
источник
params
это метод контроллера Rails (который возвращает HashWithIndifferentAccess), речь идет о Rails.Ответы:
Вы хотите
has_key?
:Простая проверка
if(params[:one])
будет обманута значениями «там, но ноль» и «там, но ложь», и вы спросите о существовании. Возможно, вам придется дифференцировать:nil
.false
.также. Трудно сказать без подробностей вашей точной ситуации.
источник
nil
параметр. Если параметр существует, это будет пустая строка.params
не были предварительно обработаны, пока мы не добрались до того места, где мы проверяем, что в нем. Отсюда мой список возможных особых случаев для проверки. Лучше точно сказать, что вы имеете в виду ИМХО.key?
метода. edgeapi.rubyonrails.org/classes/ActionController/…params.to_h.key?
сейчас.Я фанат
params[:one].present?
Просто потому, что он сохраняет
params[sym]
форму, чтобы его было легче читать.источник
has_key
вместо этого дает вам то, что вы ищете.использовать пустой? http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
вернет true, если его пусто или ноль
также ... это не будет работать, если вы тестируете логические значения .., так как
в этом случае вы могли бы использовать
источник
present?
который возвращает противоположностьblank?
. Так что вы можете превратить этоunless
в,if
если хотите.unless
это нормально. Но да, мне нравится большеif
сpresent?
Вы можете написать это более кратко следующим образом:
источник
Простой как пирог:
источник
источник
Очень простой способ предоставить значения по умолчанию вашим параметрам:
params[:foo] ||= 'default value'
источник
params.fetch(:foo, 'default value')
тожеЯ только что прочитал это на классах RubyInRails http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
Вы можете использовать
blank?
метод, который эквивалентенparams[:one].nil? || params[:one].empty?
(например)
источник
params[:one].nil? || params[:one].empty?
Вы также можете сделать следующее:
Я склонен использовать вышеупомянутое решение, когда хочу проверить более одного или двух параметров.
.values_at возвращает и массив с nil вместо любого неопределенного ключа param. то есть:
вернет следующее:
.include? (nil) затем проверяет массив на наличие значений nil. Он вернет истину, если массив содержит ноль.
В некоторых случаях вы также можете проверить, что параметры не содержат и пустую строку на ложное значение.
Вы можете обработать эти значения, добавив следующий код над оператором "исключение".
все вместе это будет выглядеть так:
Важно отметить, что delete_if изменит ваши хеш / параметры, поэтому используйте их с осторожностью.
Приведенное выше решение явно требует немного больше усилий для настройки, но оно того стоит, если вы проверяете больше, чем один или два параметра.
источник
В дополнение к предыдущим ответам:
has_key?
иhas_value?
имейте более короткие альтернативы в формеkey?
иvalue?
. Команда Ruby также предлагает использовать более короткие альтернативы, но для удобства чтения некоторые все же могут предпочесть более длинные версии этих методов.Поэтому в вашем случае это было бы что-то вроде
NB!
.key?
просто проверит, существует ли ключ, и проигнорирует любое возможное значение. Например:источник
Вот что я делаю,
а затем следующие методы:
источник
Просто собрал это вместе для той же проблемы:
первая строка проверяет, присутствуют ли наши целевые ключи в ключах params с использованием подмножества <=? оператор. Enumerable.all? без блока по умолчанию возвращает false, если любое значение равно nil или false.
источник
Вы также можете проверить, являются ли параметры пустыми, используя params [: two] .empty
источник
Я стараюсь поздно, но от дальнего взгляда отвечу:
Если вы хотите узнать, заданы ли значения в (любом) хэше, все вышеприведенное ответит true, в зависимости от их точки зрения.
Если вы хотите проверить свои параметры (GET / POST ..), вы должны использовать что-то более особенное, чем то, что вы ожидаете, как значение
params[:one]
, что-то вродеигнорирование параметра (GET / POST), как будто они не установлены, если они не соответствуют ожидаемому
просто
if params[:one]
с обнаружением nil / true или без него - это один шаг, чтобы открыть вашу страницу для взлома, потому что, как правило, это следующий шаг, чтобы использовать что-то вродеselect ... where params[:one] ...
, если это предназначено или нет, активно или внутри или после фреймворка.ответ или просто подсказка
источник