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的最佳方法是什么?
答案 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.user
和myuser
,则它们都会参数化为相同的字符串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)
问题不在于逃避我最终根据这个问题调整路线: