Rails Routes - 带有空格的Id和名称替换为连字符

时间:2016-04-30 07:06:34

标签: ruby-on-rails ruby

我正在开发第一个rails应用程序。我浏览了Rails Routing from the Outside In 文档,但无法弄清楚如何设置以下路径。

我有一个ClientsController,对于show动作,我想在url中显示客户端的名字和姓氏,并用连字符替换。

而不是以下

本地主机:3000 /客户端/ 1

链接应该是(名字:john,姓氏:doe)

本地主机:3000 /客户端/ 1 /约翰-DOE

3 个答案:

答案 0 :(得分:1)

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

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

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

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

如果您真的不想在用户模型中使用ID,请考虑使用Friendly ID gem:https://github.com/norman/friendly_id

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

答案 1 :(得分: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,它会点击show ClientsController行动id: 1name: "anything-you-want"
  3. 定义一个从用户名称生成url-name的方法。为简单起见,我假设您已定义User#url_name,但在帮助程序中定义url_name(client)可能更有意义,因为它与模型并不真正相关。
  4. 在您的应用中,使用client_name_path(@client.id, @client.url_name);例如,client_name_path(1, "john-doe")。这个url-helper名称由我们选择在路由中使用as: :client_name来定义。此调用的返回值应为“/ clients / 1 / john-doe”,我们已将其路由到ClientsController#show操作。
  5. 到目前为止,您应用中的链接将具有正确的网址,但是用户仍然可以在网址中键入任何名称,并且它会在地址栏中保留(即使页面没问题)。如果您想更进一步,例如StackOverflow,并且实际将网址更改为您可以在ClientsController#show中尝试使用redirect_to client_name_path(@client.id, @client.url_name) if params[:name] != @client.url_name的正确名称。要注意不要让自己陷入无限循环。

答案 2 :(得分:0)

你无法在铁轨中开箱即用。但是你可以使用friendly_id gem

实现这一点