Bfec5f7d1a4aaafc5a2451be8c42d26a

@post.category can be nil, or not.
Any cleaner way of doing this?

<%= (@post.category ? @post.category.name : '') + ' ' + link_to(@post.title, post_path(@post)) %>

Refactorings

No refactoring yet !

08e608a2e3fc099dbe59f9ff33dcf9be

Florian Aßmann

November 14, 2007, November 14, 2007 02:42, permalink

No rating. Login to rate!

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)}" %>
D41d8cd98f00b204e9800998ecf8427e

Emmett

November 14, 2007, November 14, 2007 07:11, permalink

No rating. Login to rate!

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)) %>
D41d8cd98f00b204e9800998ecf8427e

Emmett

November 14, 2007, November 14, 2007 07:20, permalink

1 rating. Login to rate!

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)) %>
5170ca260dbd2cdfd5a887a4dba7636f

Jeremy Weiskotten

November 16, 2007, November 16, 2007 00:21, permalink

2 ratings. Login to rate!

You could let the Post figure it out.

class Post
  # ...

  def category_name
    category.name if category
  end

  # ...
end


<%= @post.category_name %>
73bbbb0f269644da4204577cebd2c3ab

Martin Dufort

November 16, 2007, November 16, 2007 18:42, permalink

No rating. Login to rate!

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....

Bfec5f7d1a4aaafc5a2451be8c42d26a

macournoyer

November 16, 2007, November 16, 2007 19:24, permalink

No rating. Login to rate!

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(' : ') %>
5170ca260dbd2cdfd5a887a4dba7636f

Jeremy Weiskotten

November 16, 2007, November 16, 2007 20:01, permalink

2 ratings. Login to rate!

Even with my solution, you could use compact.join to accomplish it.

<%= [@post.category_name, link_to(@post.title, post_path(@post))].compact.join(' : ') %>
Bfec5f7d1a4aaafc5a2451be8c42d26a

macournoyer

November 16, 2007, November 16, 2007 20:06, permalink

No rating. Login to rate!

indeed, very cool Jeremy, thx a lot!

5170ca260dbd2cdfd5a887a4dba7636f

Jeremy Weiskotten

November 16, 2007, November 16, 2007 20:09, permalink

1 rating. Login to rate!

I can has ratings now? ;)

73bbbb0f269644da4204577cebd2c3ab

Martin Dufort

November 17, 2007, November 17, 2007 19:21, permalink

No rating. Login to rate!

There it is....

0fe01b8879c35beee8c9b2e9212a5b87

JohnnyBusca

November 28, 2007, November 28, 2007 23:06, permalink

No rating. Login to rate!

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..

3efae22c9d319bc039158f69fe3ad26a

Randy

December 7, 2007, December 07, 2007 16:12, permalink

No rating. Login to rate!

You could do this too, which I demonstrate on my webpage:

<%= @post.category.name rescue nil %>
606384686bc1be42acd5a1f610613e66

Bernardo Rufino

December 27, 2007, December 27, 2007 03:59, permalink

No rating. Login to rate!

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 =(

Your refactoring





Format Copy from initial code

or Cancel