Estou usando uma instrução IF no Ruby on Rails para tentar testar se os parâmetros de solicitação estão definidos. Independentemente de os dois parâmetros serem definidos ou não, a primeira parte do seguinte se o bloco for acionado. Como posso fazer com que esta peça seja acionada SOMENTE se os parâmetros [: um] e [: dois] estão definidos?
if (defined? params[:one]) && (defined? params[:two])
... do something ...
elsif (defined? params[:one])
... do something ...
end
ruby-on-rails
ruby
Darren
fonte
fonte
params
é um método do controlador Rails (que retorna um HashWithIndifferentAccess), trata-se de Rails.Respostas:
Você quer
has_key?
:Apenas verificar
if(params[:one])
será enganado por um valor "lá, mas nulo" e "lá, mas falso", e você está perguntando sobre a existência. Pode ser necessário diferenciar:nil
.false
.também. Difícil dizer sem mais detalhes da sua situação precisa.
fonte
nil
parâmetro. Se o parâmetro existir, será uma sequência vazia.params
não tenha sido pré-processado antes de chegarmos aonde estamos verificando o que está nele. Daí a minha lista de possíveis casos especiais para verificar. Melhor dizer exatamente o que você quer dizer com IMHO.key?
método. edgeapi.rubyonrails.org/classes/ActionController/…params.to_h.key?
agora.Eu sou fã de
params[:one].present?
Só porque ele mantém o
params[sym]
formulário e fica mais fácil de ler.fonte
has_key
em vez disso, fornece o que você está procurando.usar em branco? http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
retornará true se estiver vazio ou nulo
Também ... isso não funcionará se você estiver testando valores booleanos.
Nesse caso, você poderia usar
fonte
present?
que retorna o oposto deblank?
. Então você pode transformar issounless
em um,if
se quiser.unless
está ok. Mas sim, eu gosto maisif
compresent?
Você pode escrevê-lo de forma mais sucinta como o seguinte:
fonte
Simples como torta:
fonte
fonte
Uma maneira muito simples de fornecer valores padrão para seus parâmetros:
params[:foo] ||= 'default value'
fonte
params.fetch(:foo, 'default value')
muitoAcabei de ler isso nas classes RubyInRails http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
você pode usar
blank?
método equivalente aparams[:one].nil? || params[:one].empty?
(por exemplo)
fonte
params[:one].nil? || params[:one].empty?
Você também pode fazer o seguinte:
Costumo usar a solução acima quando quiser verificar mais de um ou dois parâmetros.
.values_at retorna e matriz com zero no lugar de qualquer chave param indefinida. ou seja:
retornará o seguinte:
.includes? (nil), em seguida, verifica se há valores nulos na matriz. Retornará true se o array incluir nulo.
Em alguns casos, você também pode querer verificar se os parâmetros não contêm e esvaziam a string com valor falso.
Você pode manipular esses valores adicionando o código a seguir acima da instrução salvo.
todos juntos ficaria assim:
É importante observar que delete_if modificará seus hash / parâmetros, portanto, use com cuidado.
A solução acima claramente requer um pouco mais de trabalho para configurar, mas vale a pena se você estiver verificando mais do que apenas um ou dois parâmetros.
fonte
Além das respostas anteriores:
has_key?
ehas_value?
tenha alternativas mais curtas na forma dekey?
evalue?
. A equipe Ruby também sugere o uso de alternativas mais curtas, mas para facilitar a leitura alguns ainda podem preferir versões mais longas desses métodos.Portanto, no seu caso, seria algo como
NB!
.key?
apenas verificará se a chave existe e ignora o valor possível. Por exemplo:fonte
Aqui está o que eu faço,
e depois os seguintes métodos:
fonte
Apenas reuni-lo para o mesmo problema:
a primeira linha verifica se nossas chaves de destino estão presentes nas chaves dos parâmetros usando o subconjunto <=? operador. Enumerable.all? sem bloco por padrão retornará falso se algum valor for nulo ou falso.
fonte
Você também pode verificar se os parâmetros estão vazios usando os parâmetros [: two] .empty
fonte
Eu tento um atraso, mas de longe vista resposta:
Se você deseja saber se os valores em um (qualquer) hash estão definidos, tudo acima responde como verdadeiro, dependendo do ponto de vista deles.
Se você quiser testar seus parâmetros (GET / POST ..), use algo mais especial para o que você espera que seja o valor
params[:one]
, algo comoignorando o parâmetro (GET / POST) como se eles não estivessem definidos, se não se ajustassem como esperado
apenas uma
if params[:one]
detecção com ou sem nula / verdadeira é um passo para abrir sua página para hackers, porque normalmente é o próximo passo para usar algo comoselect ... where params[:one] ...
, se isso é intencional ou não, ativo ou dentro ou após uma estrutura.uma resposta ou apenas uma dica
fonte