I was thinking that at the top of my partial I would have something like this
<% optional_width = default_value unless (defined? optional_width)
But I've had inconsistent results with this, I'm thinking this is not a good way to do this. What is the "correct" way to do this in rails?
The way we use locals with a partial is similar to how we pass arguments into a method. In the locals Hash , the post_author: key is the argument name, and the value of that argument, @author , is the value stored as post_author and passed into the method.
local_assigns is a Rails view helper method that you can check whether this partial has been provided with local variables or not. Here you render a partial with some values, the headline and person will become accessible with predefined value.
Read the Passing local variables to sub templates section in the ActionView::Base docs
Basically it says you should use this pattern:
<% if local_assigns.has_key? :headline %>
Headline: <%= headline %>
<% end %>
For you, this might translate to something like:
<div style="width: <%= local_assigns.has_key?(:optional_width) ? optional_width : 500 %>px;">
<!-- filler -->
</div>
According to the docs
Testing using
defined? headline
will not work. This is an implementation restriction.
Although not exactly equivalent to your code, that's usually done with ||
operator.
<% optional_width ||= default_value %>
This is equivalent to optional_width = optional_width || default_value
. Due to shot-circuit evaluation, if optional_with
is "true", i.e. it's defined, and not nil
, the right-hand part becomes equal to it, and default_value
is not even computed. Otherwise, right-hand part would be equal to default_value
. That's essentially what you want to do.
Ok, I admit that it may not work for partial's locals. The particular situation I can imagine is that if in first render call the optional_width
variable was set to some value, and in the consequent call to render
it is not mentioned at all while keeping its value from the first run. Can't do such a check right now, though.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With