In Rails it is very advisable to not use any instance variables inside your partials if you want to re-use that partial in a different context.
It is much better to simply leverage locals that you pass into your render like this:
That way you can simply use posts
inside the template without having to rely on @posts coming from the controller (and it's also not dependant on controller code any more but rather only on data inside the view that's calling it.. very handy).
But, as always there are times when you have additional locals that are optional to only some contexts.
In my case I had Kaminari paginate the list I was passing to the partial, but in some other views the list was not be paginated. Turns out you can't do the usual rails style if foo
here because the variable is simply not defined and Ruby will throw an error (unlike with @variables in Rails).
That's where the defined? method comes in very handy (as suggested by Thorsten Ball):
If you simply want to assign a default value to a local you can use the ||= operator:
This enables me to use the partial in several ways without having to re-introduce the locals at every corner: