更简单的生成路径的方法

时间:2010-05-10 01:38:18

标签: ruby-on-rails routing

Rap Genius上的歌曲有/lyrics/The-notorious-b-i-g-ft-mase-and-puff-daddy/Mo-money-mo-problems之类的路径,这些路径在routes.rb中定义为:

map.song '/lyrics/:artist_slug/:title_slug', :controller => 'songs', :action => 'show'

当我想要生成这样的路径时,我使用song_url(:title_slug => song.title_slug, :artist_slug => song.artist_slug)。但是,我更希望能够输入song_url(some_song)。除了定义一个帮助器之外,我有没有办法实现这一点:

  def x_song_path(song)
    song_path(:title_slug => song.title_slug, :artist_slug => song.artist_slug)
  end

1 个答案:

答案 0 :(得分:0)

也许不是定义两个slu,而是你可以只拥有一个标题和艺术家作为其中一部分。所以你的路线是:

map.song '/lyrics/:slug', :controller => 'songs', :action => 'show'

然后在你的模型中定义一个返回slug的to_param:

class Song < ActiveRecord::Base
  def to_param
    artist.gsub(/\W+/, '-') + '/' + title.gsub(/\W+/, '-')
  end
end

我不完全确定这是否可行(它可能会尝试对“/”进行编码,但如果您将路线更改为

map.song '/lyrics/*:slug', :controller => 'songs', :action => 'show'
你可能能够解决这个问题。希望至少能为您提供正确的观点。