我正在开发我的第一个轨道应用程序。我通过了Rails Routing from the Outside In 文档,但无法弄清楚如何设置下面的路线。轨道路线 - 用连字符替换空格的ID和名称
我有一个ClientsController和显示操作我想显示客户端的名字和空格替换为连字符,在URL中。
取而代之的是以下
本地主机:3000 /客户/ 1
的链接应该是(名字:约翰,姓氏:DOE)
本地主机:3000 /客户/ 1/john-doe
我正在开发我的第一个轨道应用程序。我通过了Rails Routing from the Outside In 文档,但无法弄清楚如何设置下面的路线。轨道路线 - 用连字符替换空格的ID和名称
我有一个ClientsController和显示操作我想显示客户端的名字和空格替换为连字符,在URL中。
取而代之的是以下
本地主机:3000 /客户/ 1
的链接应该是(名字:约翰,姓氏:DOE)
本地主机:3000 /客户/ 1/john-doe
此处的策略是将URL中的名称视为丢弃变量,因为它不被用作标识符。注意,在StackOverflow中,你可以输入任何你想要的名字,只要这个ID是正确的,你就会得到你想要的页面。因此,我们可以做到这一点:
resources :clients
,所以你可以去/clients/1
get 'clients/:id/:name', to: 'clients#show', as: :client_name
正常路线。这可以让你去/clients/1/anything-you-want
,它会在ClientsController
与id: 1
和name: "anything-you-want"
击中show
行动。User#url_name
,但在助手中定义url_name(client)
可能更有意义,因为它与模型无关。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
。只要小心,不要陷入无限循环。
你不能在导轨中开箱即用。但你可以实现,使用friendly_id宝石
我想你的意思是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编码,但它看起来不会很漂亮。
+1 ..谢谢你的详细回答。第一个和最后一个是为了使网址seo友好,就像stackoverflow正在做的一样,url中的id就是标识符。 – ZedBee
谢谢..这是很好和简单的方法。 – ZedBee