如何在Rails 2.3.5中转义link_to:id值

时间:2011-06-18 18:00:38

标签: ruby-on-rails

On Rails 2.3.5

我认为有关生活在以下网址的用户的公开信息:

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

我的路线:

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

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

当我链接到它时:

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

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

2 个答案:

答案 0 :(得分:1)

CGI::escape(user.username)

该方法将对URI进行URI编码,以便在URL中安全。 Rails不会自动执行吗?你有没有尝试逃避并把疯狂的角色放进去?

编辑,反之亦然:

CGI::unescape(params[:id])

虽然我仍然觉得rails可以自动为你处理它。可能想测试。

再次编辑:

Rails确实有.parameterize方法,因此:user.username.parameterize会使字符串对网址友好,这里记录了它:http://apidock.com/rails/v3.0.7/String/parameterize

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

我认为这样做的可接受方式是(如文档示例所示),如下所示:

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

这样一来,如果你User.find(params[:id])它会删除第一个数字之后的所有内容,并将其用作id。有些宝石可以创建一个独特的参数友好字符串供您使用,如果您真的反对在params中使用用户ID(有这个问题的原因吗?)。一个这样的宝石是friendly_id:https://github.com/norman/friendly_id/虽然还有其他宝石。我们的想法是,你的模型上有另一个专门用于url的字段,它是在你的用户名字段的before_create上自动生成的。它必须是独特的,参数友好的,宝石需要照顾。

希望这个答案能帮到你更多:p

答案 1 :(得分:0)

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

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