Is there a practical and not too-convoluted way to implement null objects that can be used in the link_to helper on par with their “real” counterparts? I’m specifically thinking about associations, so that if there is
class Sponsor
has_many :sponsorships
def most_recent_active_sponsorship
sponsorships.active.last || NullSponsorship.new
end
end
then in the view it would be possible to get rid of the if clause:
<p>Most recent active sponsorship:</p>
<% sponsorship = @sponsor.most_recent_active_sponsorship %>
<%# if sponsorship %>
<%= link_to sponsorship.name, sponsorship %>
<%# end %>
Using the null object in the link_to should render the return value of its #name method (e.g. “none”) as something clearly unclickable.
You can use the presenter pattern for this sort of thing. Check out this blog post for an example:
Probably overkill if this is a one-off scenario, if that’s the case I would suggest moving the logic into a helper method if you wish to clean up the view some.
I had this exact need a few days ago, and even with @seangriffin’s help it turned out to be enough of a pain in the ass that I abandoned the refactoring.
Yeah, the short answer is yes a null object can be used, but link_to is still going to want to call a URL helper method, so you’d need to define a null_path and null_url helper method that could be used.