web-dev-qa-db-fra.com

Comment vérifier si une variable est définie dans des rails?

<% if dashboard_pane_counter.remainder(3) == 0 %>
  do something
<% end>

Si dasboard_pane_counter n’a pas été défini, comment puis-je l’évaluer à false plutôt que de lever une exception?

27
cjm2671
<% if defined?(:dashboard_pane_counter) && dashboard_pane_counter.remainder(3) == 0  %>
  # do_something here, this assumes that dashboard_pane_counter is defined, but not nil
<% end %>
48
Matt

Lors de l'utilisation de Rails et de variables d'instance, la méthode try est définie dans nil. Vous pouvez donc:

<% if @dashboard_pane_counter.try(:remainder(3)) == 0  %>
   #do something
<% end %>

donc, si la variable d'instance n'est pas définie, try(:anything) renverra nil et sera donc évalué à false. Et nil == 0 est faux

5
Yule

local_assigns peut être utilisé pour cela, puisque cette question a été posée il y a quelques années, j'ai vérifié qu'elle existe dans les versions précédentes de Rails

<% if local_assigns[:dashboard_pane_counter] 
                 && dashboard_pane_counter.remainder(3) == 0%>
<% end %>

C'est dans les notes ici

http://apidock.com/Rails/ActionController/Base/render

3
katzmopolitan

Publier cette réponse pour les codeurs débutants comme moi. Vous pouvez répondre à cette question simplement en utilisant deux étapes (ou une si vous utilisez &&). C'est une réponse plus longue et moins jolie, mais elle aide les nouveaux codeurs à comprendre ce qu'ils font et utilise une technique très simple qui ne figure pas encore dans les autres réponses. L'astuce consiste à utiliser une variable d'instance (@), cela ne fonctionnera pas avec une variable locale:

if @foo
  "bar"
end

Si @foo est défini, il retournera "bar", sinon non (sans erreur). Donc en deux étapes:

if @dashboard_pane_counter
  if @dashboard_plane_counter.remainder(3) == 0
    do something
  end
end
0
Dennis