Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

optional local variables in rails partial templates: how do I get out of the (defined? foo) mess?

I do this:

<% some_local = default_value if local_assigns[:some_local].nil? %>

Since local_assigns is a hash, you could also use fetch with the optional default_value.

local_assigns.fetch :foo, default_value

This will return default_value if foo wasn't set.

WARNING:

Be careful with local_assigns.fetch :foo, default_value when default_value is a method, as it will be called anyway in order to pass its result to fetch.

If your default_value is a method, you can wrap it in a block: local_assigns.fetch(:foo) { default_value } to prevent its call when it's not needed.


How about

<% foo ||= default_value %>

This says "use foo if it is not nil or true. Otherwise assign default_value to foo"


I think this should be repeated here (from http://api.rubyonrails.org/classes/ActionView/Base.html):

If you need to find out whether a certain local variable has been assigned a value in a particular render call, you need to use the following pattern:

<% if local_assigns.has_key? :headline %>
  Headline: <%= headline %>
<% end %>

Testing using defined? headline will not work. This is an implementation restriction.