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.
1 Answer 1
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
-
\$\begingroup\$ +1 this is the bottom-up approach to DRY, let's hope someone to contribute the top-down approach :-) \$\endgroup\$tokland– tokland2013年05月25日 20:04:05 +00:00Commented May 25, 2013 at 20:04
-
\$\begingroup\$ What do you mean with "top-down DRY"? \$\endgroup\$Sirupsen– Sirupsen2013年05月25日 20:12:16 +00:00Commented May 25, 2013 at 20:12
-
\$\begingroup\$ A top-down DRYing here would use a
each
loop. \$\endgroup\$tokland– tokland2013年05月25日 20:22:16 +00:00Commented May 25, 2013 at 20:22 -
\$\begingroup\$ 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. \$\endgroup\$Sirupsen– Sirupsen2013年05月25日 20:24:01 +00:00Commented May 25, 2013 at 20:24
-
\$\begingroup\$ 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. \$\endgroup\$tokland– tokland2013年05月25日 20:26:29 +00:00Commented May 25, 2013 at 20:26