Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Rails 2.3.5中将link_转义为:id值_Ruby On Rails - Fatal编程技术网

Ruby on rails 如何在Rails 2.3.5中将link_转义为:id值

Ruby on rails 如何在Rails 2.3.5中将link_转义为:id值,ruby-on-rails,Ruby On Rails,轨道上2.3.5 我有一种观点认为,关于居住在URL上的用户的公开信息如下: "#{user.id}-#{user.username.parameterize}" 我的路线: map.connect 'members/:id', :controller => "users", :action => "showmember" 我从不想为用户公开int-id,所以我使用用户名作为该视图的id 当我链接到它时: <%=link_to user.username, :contro

轨道上2.3.5

我有一种观点认为,关于居住在URL上的用户的公开信息如下:

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

我的路线:

map.connect 'members/:id', :controller => "users", :action => "showmember"
我从不想为用户公开int-id,所以我使用用户名作为该视图的id

当我链接到它时:

<%=link_to user.username, :controller => 'users', :action => 'showmember', :id => user.username %>
'users',:action=>'showmember',:id=>user.username%>
除了用户名碰巧包含需要转义的字符外,一切正常。在link_to中逃逸id的最佳方法是什么

CGI::escape(user.username)
该方法将URI编码该值,以便在URL中安全。Rails不是自动完成的吗?你有没有试着不逃跑,不在里面放疯狂的角色

编辑,以及相反的版本:

CGI::unescape(params[:id])
尽管我仍然觉得rails可能会自动为您处理它。可能需要测试

再次编辑:

Rails确实有一个
.parameterize
方法,因此:
user.username.parameterize
将使字符串url友好,如下所示:

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

我认为公认的做法是(如doc示例所示):

"#{user.id}-#{user.username.parameterize}"
这样,如果您执行
User.find(params[:id])
操作,它会去掉第一个数字后面的所有内容,并将其用作id。如果您确实反对在params中使用用户id,那么可以使用一些gems来生成一个独特的参数友好字符串(有什么原因引起这种担心吗?)。一个这样的宝石是友好的:尽管还有其他宝石。我们的想法是,在您的模型上有另一个专门用于url的字段,它是在基于您的用户名字段创建之前自动生成的。它必须是唯一的和参数友好的,由gem负责


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

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


嗯,也许还有别的事。如果用户名有一个。在它里面我得到了一个路由错误。我以为这是因为它没有逃脱,但也许我错了。ActionController::RoutingError(没有路由匹配“/members/test.member”和{:method=>:get}):我用更好的解决方案更新了我的帖子。如果你真的不想在URL中使用id,那么你最好的选择可能是为你生成slug。感谢所有令人敬畏的输入,这是一个很好的阅读和信息,尽管我最终根据以下内容调整了路线:。我模糊了ID,因为我不想让用户的数量变得清晰。