【问题标题】:Rails Routes - Id and name with spaces replaced with hyphensRails Routes - 将空格替换为连字符的 ID 和名称
【发布时间】:2016-04-30 07:06:33
【问题描述】:

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

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

而不是下面的

localhost:3000/clients/1

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

localhost:3000/clients/1/john-doe

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案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,它会在ClientsController 中使用id: 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")。这个 url-helper 名称是由我们选择在路由中使用 as: :client_name 定义的。此调用的返回值应该是“/clients/1/john-doe”,我们已经将其路由到ClientsController#show 操作。

    到目前为止,您的应用程序中的链接将具有正确的 URL,但用户仍然可以在 URL 中输入任何名称,并且它会保留在地址栏中(即使页面没有问题)。如果您想像 StackOverflow 一样走得更远,并且实际上将 url 更改为正确的名称,您可以尝试在 ClientsController#show 中尝试到 redirect_to client_name_path(@client.id, @client.url_name) if params[:name] != @client.url_name。请注意不要让自己陷入无限循环。

    【讨论】:

    • 谢谢.. 这是一个很好且简单的方法。
    【解决方案2】:

    我想你的意思是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,请考虑使用 Friendly ID gem:https://github.com/norman/friendly_id

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

    【讨论】:

    • +1 .. 感谢您的详细回答。第一个和最后一个旨在使 url seo 友好,就像 stackoverflow 所做的那样,url 中的 id 是标识符。
    【解决方案3】:

    您不能在 rails 中开箱即用地做到这一点。但是您可以使用friendly_id gem 实现这一目标

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 2019-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 2022-10-13
      • 2020-11-29
      相关资源
      最近更新 更多