【问题标题】:How to escape link_to :id value in Rails 2.3.5如何在 Rails 2.3.5 中转义 link_to :id 值
【发布时间】:2011-06-18 18:00:37
【问题描述】:

在 Rails 2.3.5 上

我认为有关用户的公共信息位于这样的 URL:

http://www.mysite.com/users/johndoe

我的路线:

map.connect 'members/:id', :controller => "users", :action => "showmember"

我从不想为用户公开 int ID,因此我使用用户名作为该视图的 ID。

当我链接到它时:

<%=link_to user.username, :controller => 'users', :action => 'showmember', :id => user.username %>

一切都很好,除非用户名恰好包含需要转义的字符。在link_to中转义id的最佳方法是什么?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:
    CGI::escape(user.username)
    

    该方法将对值进行 URI 编码,因此它在 URL 中是安全的。 Rails 不会自动完成吗?你有没有试过不逃跑,把疯狂的角色放进去?

    编辑,和相反的版本:

    CGI::unescape(params[:id])
    

    虽然我仍然觉得 Rails 可能会自动为您处理它。可能想测试一下。

    再次编辑:

    Rails 确实有一个 .parameterize 方法,所以:user.username.parameterize 将使字符串对 url 友好,它记录在这里:http://apidock.com/rails/v3.0.7/String/parameterize

    这样做的主要问题是,如果您有 2 个用户名:my.usermyuser,它们都将参数化为相同的字符串 myuser

    我认为公认的做法是(如文档示例所示)如下:

    "#{user.id}-#{user.username.parameterize}"
    

    如果你这样做User.find(params[:id]),它会删除第一个数字之后的所有内容,并将其用作 id。如果您真的反对在参数中包含用户 ID(有这种担忧的原因吗?),那么有些 gem 会为您提供一个独特的参数友好字符串供您使用。一个这样的宝石是friendly_id:https://github.com/norman/friendly_id/ 尽管还有其他宝石。这个想法是您的模型上有另一个专门用于 url 的字段,它是根据您的用户名字段在 before_create 上自动生成的。它必须是唯一且参数友好的,由 gem 负责。

    希望这个答案可以帮助你更多:p

    【讨论】:

    • 嗯,也许还有其他事情发生。如果用户名有 .在其中我得到一个路由错误。我认为这是因为它没有被逃脱,但也许我错了。 ActionController::RoutingError (没有路由匹配 "/members/test.member" 与 {:method=>:get}):
    • 我用更好的解决方案更新了我的帖子。如果你真的不想要 URL 中的 id,你最好的选择可能是为你生成 slug 的 gem。
    • 感谢所有精彩的输入,尽管我最终基于此调整了路线:stackoverflow.com/questions/5768326/…。我隐藏了 ID,因为我不想让用户数量变得可辨。
    【解决方案2】:

    问题不在于逃跑,我最终根据这个问题调整了路线:

    Rails query string with a period (or full stop).

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      相关资源
      最近更新 更多