2009-10-19 101 views
0

我有我的代码的路线,看起来像这样:问题与友好的URL路由的名称,而不是ID

map.app 'applications/:title_header', :controller => 'apps', :action => 'show' 

我也改变了我的表演方法,在控制器中是这样的:

@app = App.find_by_title_header(params[:title_header]) 

如果我输入applications/title事情工作正常。如果我在applications/1(有效身份证件),键入它失败(如预期)

然而,当我试图使用友好的URL佣工,在这种情况下app_path(@app)所生成的网址看起来像applications/1。唯一能让它工作的方法是放入app_path(@app.title_header)。看起来好像它只是“知道”这个ID是从应用程序对象中传出来的,它应该“知道”它现在应该默认传递该名称。我需要改变什么?

+0

那么,当你有友好的网址“1234”,这将与ID一致吗? – Zepplock

+0

你假设应用程序在routes.rb中被列为资源。即便如此,路由将使用描述所请求url的第一个匹配条目。 – EmFi

回答

0

其实我最终做的并没有触及to_param。与其他页面一样,我需要to_param是一个ID,而不是固定链接。

我结束了刚刚通过@app.permalink到URL方法,而不是触及to_param,但那一个仍然是有用的知道。

-1

听起来正确。 Rails并不认为它在命名路由中遇到的符号是对象上的方法。

解决这个问题的最好方法是向application_helper.rb添加一个自定义助手,该助手创建需要使用的语法并将其传递给更基本的url版本。

def my_app_path(object, args) 
    if object.responds_to? :title_header 
    app_path(object.title_header, args) 
    else 
    raise "Cannot generate url from object, missing title_header" 
    end 
end 
3

最简单,最轻的解决方法就是使用to_param:

class Application < ActiveRecord::Base 

    def to_param 
    title_header.parameterize 
    end 

end 

字符串实例方法parameterize将确保该字符串是适当的URL。然后,在您的控制器中,您只需更新所有find即可使用find_by_title_header而不仅仅是find

确保你是title_header s将是唯一的!

+0

谢谢我最终做了这样的事情... –