我正在开发第一个rails应用程序。我浏览了Rails Routing from the Outside In 文档,但无法弄清楚如何设置以下路径。
我有一个ClientsController,对于show动作,我想在url中显示客户端的名字和姓氏,并用连字符替换。
而不是以下
本地主机:3000 /客户端/ 1
链接应该是(名字:john,姓氏:doe)
本地主机:3000 /客户端/ 1 /约翰-DOE
答案 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正确,您就可以获得所需的页面。所以我们也可以这样做:
resources :clients
定义正常路线,以便转到/clients/1
get 'clients/:id/:name', to: 'clients#show', as: :client_name
。这样,您就可以转到/clients/1/anything-you-want
,它会点击show
ClientsController
行动id: 1
和name: "anything-you-want"
。User#url_name
,但在帮助程序中定义url_name(client)
可能更有意义,因为它与模型并不真正相关。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
操作。到目前为止,您应用中的链接将具有正确的网址,但是用户仍然可以在网址中键入任何名称,并且它会在地址栏中保留(即使页面没问题)。如果您想更进一步,例如StackOverflow,并且实际将网址更改为您可以在ClientsController#show
中尝试使用redirect_to client_name_path(@client.id, @client.url_name) if params[:name] != @client.url_name
的正确名称。要注意不要让自己陷入无限循环。
答案 2 :(得分:0)
你无法在铁轨中开箱即用。但是你可以使用friendly_id gem
实现这一点