<%= (@post.category ? @post.category.name : '') + ' ' + link_to(@post.title, post_path(@post)) %>
Refactorings
No refactoring yet !
Florian Aßmann
November 14, 2007, November 14, 2007 02:42, permalink
If you place an object into a evaluated string literal the to_s method is called on this object. When to_s is called on nil it returns an empty String and now, if it's called on your Category it returns the category's name.
class Category < ActiveRecord::Base
# ...
def to_s() name end
end
<%= "#{@post.category} #{link_to @post.title, post_path(@post)}" %>
Emmett
November 14, 2007, November 14, 2007 07:11, permalink
The simple way; not sure it's so much better than your original.
<%= @post.category.name if @post.category %> <%= link_to(@post.title, post_path(@post)) %>
Emmett
November 14, 2007, November 14, 2007 07:20, permalink
The fancy, ridiculous way. Feel free to change % to whatever suits you.
| or > ? safe_send? ss?
class Object
def %(method)
send(method) if respond_to?(method)
end
end
<%= @post.category%:name %> <%= link_to(@post.title, post_path(@post)) %>
Jeremy Weiskotten
November 16, 2007, November 16, 2007 00:21, permalink
You could let the Post figure it out.
class Post
# ...
def category_name
category.name if category
end
# ...
end
<%= @post.category_name %>
Martin Dufort
November 16, 2007, November 16, 2007 18:42, permalink
The best of all is Jeremy's suggestion as it is supporting the encapsulation model of the Post object and then you can easily change behavior with affecting a number of other areas. Encapsulation is key here....
macournoyer
November 16, 2007, November 16, 2007 19:24, permalink
thx for the replies
I like Jeremy solution too. But what if we want to split the category and post title w/ ":". If there's no category, we don't want a lonely ":" on front.
What do you think of:
<%= [@post.category.name if @post.category, link_to(@post.title, post_path(@post))].compact.join(' : ') %>
Jeremy Weiskotten
November 16, 2007, November 16, 2007 20:01, permalink
Even with my solution, you could use compact.join to accomplish it.
<%= [@post.category_name, link_to(@post.title, post_path(@post))].compact.join(' : ') %>
macournoyer
November 16, 2007, November 16, 2007 20:06, permalink
indeed, very cool Jeremy, thx a lot!
JohnnyBusca
November 28, 2007, November 28, 2007 23:06, permalink
I had a some similar in http://refactormycode.com/codes/50-show-a-default-value-if-object-or-field-is-empty
michiel's refactoring helped me..
Randy
December 7, 2007, December 07, 2007 16:12, permalink
You could do this too, which I demonstrate on my webpage:
<%= @post.category.name rescue nil %>
Bernardo Rufino
December 27, 2007, December 27, 2007 03:59, permalink
In the next Ruby version (I think in 1.9 already), NameError will be a direct descendent of Exception, so rescue wont work anymore, as it rescues descendents of StandardError =(
@post.category can be nil, or not.
Any cleaner way of doing this?