dochead
dochead

Reputation: 1825

Generate the URL for a generic path with possible options in Rails

I'm creating a customisable nav menu for our site and have run into the following problem.

I need to generate a URL to any controller and action on the site and optionally pass it parameters. I was able to do the former by simply saying:

url_for(:controller => nav[:controller_name], :action => nav[:action_name])

which is great for sending you to {controller}/{action}. eg. news/articles

Throwing options in suddenly changes the game. Now I need to send you to something like: {controller}/{action}/{category}/{slug}/{id}

eg. news/articles/world-domination/montana-max-vows-revenge/12345

the helper for the above would be something along the lines of:

news_article_path('world-domination', 'montana-max-vows-revenge', '12345')

and I haven't been able to replicate that in a vanilla url_for due to the arguments.

What I have done, and I don't really like is:

url_for(send("#{nav[:controller_name]}_#{nav[:action_name]}_path", *nav[:options]))

which generates the helper using send and then passes it a kwargs list. I'm sure there's a better way to do that surely?

Upvotes: 2

Views: 798

Answers (1)

Jacob Brown
Jacob Brown

Reputation: 7561

You can do this cleanly if you are able to name the options (split here over lines for legibility):

url_for({
  :controller => nav[:controller_name],
  :action => nav[:action_name]
}.merge(nav[:options] || {}))

where

nav = {
  :controller_name => 'news',
  :action_name => 'articles',
  :options => {
    :category => 'world-domination',
    :slug => 'montana-max-vows-revenge',
    :id => '12345'
  }
}

Upvotes: 1

Related Questions