2016-04-30 68 views
0

我正在开发我的第一个轨道应用程序。我通过了Rails Routing from the Outside In 文档,但无法弄清楚如何设置下面的路线。轨道路线 - 用连字符替换空格的ID和名称

我有一个ClientsController和显示操作我想显示客户端的名字和空格替换为连字符,在URL中。

取而代之的是以下

本地主机:3000 /客户/ 1

的链接应该是(名字:约翰,姓氏:DOE)

本地主机:3000 /客户/ 1/john-doe

回答

1

此处的策略是将URL中的名称视为丢弃变量,因为它不被用作标识符。注意,在StackOverflow中,你可以输入任何你想要的名字,只要这个ID是正确的,你就会得到你想要的页面。因此,我们可以做到这一点:

  1. 定义使用resources :clients,所以你可以去/clients/1
  2. 定义另一条路线get 'clients/:id/:name', to: 'clients#show', as: :client_name正常路线。这可以让你去/clients/1/anything-you-want,它会在ClientsControllerid: 1name: "anything-you-want"击中show行动。
  3. 定义从用户名中生成url-name的方法。为了简单起见,我假设你已经定义了User#url_name,但在助手中定义url_name(client)可能更有意义,因为它与模型无关。
  4. 在您的应用中,使用client_name_path(@client.id, @client.url_name);例如,client_name_path(1, "john-doe")。这个网址帮助名称由我们选择在路线中使用as: :client_name来定义。这次调用的返回值应该是“/ clients/1/john-doe”,我们已经发送到ClientsController#show操作。

到目前为止,在您的应用程序的链接就会有正确的URL,但用户仍然可以在URL中键入任何名字,它会在地址栏(即使页面就可以了)依然存在。如果你想更进一步,像StackOverflow,并实际上更改网址为正确的名称,你可以尝试在ClientsController#show,到redirect_to client_name_path(@client.id, @client.url_name) if params[:name] != @client.url_name。只要小心,不要陷入无限循环。

+0

谢谢..这是很好和简单的方法。 – ZedBee

0

你不能在导轨中开箱即用。但你可以实现,使用friendly_id宝石

1

我想你的意思是localhost:3000/clients/john-doe不是localhost:3000/clients/1/john-doe? (在后一种情况下,/1/将是多余的)。

您的第一个选择是在User模型中定义to_param方法。您需要返回参数的开始你的模型ID:

def to_param 
    [id, first_name, last_name].join("-") 
end 

User.find_by(last_name: "doe").to_param # => 1-john-doe 

如果你真的不想要你的用户模型中的ID,然后再考虑使用友好的ID宝石:https://github.com/norman/friendly_id

我然而,请注意不要在您的路线中使用first-last作为标识符。首先,如果你有两个用户姓名相同(最终会发生),会发生什么?其次,如果你的用户有不寻常的名字,比如那些带有空格或撇号的名字(例如“O'neill”等)?你总是可以对这种情况进行URL编码,但它看起来不会很漂亮。

+0

+1 ..谢谢你的详细回答。第一个和最后一个是为了使网址seo友好,就像stackoverflow正在做的一样,url中的id就是标识符。 – ZedBee