Take the 2-minute tour ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

In my Rails 4 app i used to have every view contain a content_for :nav tag which included all of the links for the nav bar in my layout. This was getting annoying because if i wanted to add a button i would have to go through every view and add that link. I decide to make a partial view in layouts/_nav.haml which contains:

= link_to 'Home', root_path, :class => "btn #{active_page(root_path)}"
= link_to 'Sign in', sign_in_path, :class => "btn #{active_page(sign_in_path)}"
= link_to 'Account', account_path, :class => "btn #{active_page(account_path)}"

and then in my application_helper.rb i added:

def active_page(path)
  'active' if current_page?(path)
end

I know this isn't the best approach, is there any way to DRY up this solution or make it better. Im using bootstrap and i tried the simple-navigation gem but it wasn't that useful in my situation.

share|improve this question
add comment

1 Answer

up vote 5 down vote accepted

You could create another helper to create your navigation links:

def navigation_link_to(text, path)
  link_to text, path, class: "btn #{active_page(path)}"
end 

Then in your view:

= navigation_link_to 'Home', root_path
= navigation_link_to 'Sign in', sign_in_path
= navigation_link_to 'Account', account_path
share|improve this answer
    
+1 this is the bottom-up approach to DRY, let's hope someone to contribute the top-down approach :-) –  tokland May 25 '13 at 20:04
    
What do you mean with "top-down DRY"? –  Sirupsen May 25 '13 at 20:12
    
A top-down DRYing here would use a each loop. –  tokland May 25 '13 at 20:22
    
Ah yeah, I didn't wanna do that since I think this is more clear to read in the view code, than defining an array of objects. Perhaps unless you have a very large amount of links. –  Sirupsen May 25 '13 at 20:24
    
Exactly, when there are few elements that's the more readable. And when elements grow you can always combine both, a method abstraction + a loop of the data. –  tokland May 25 '13 at 20:26
show 2 more comments

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.