现在当我点击id = 1的用户时,在网址栏上显示
用户/ 1
我想将其更改为
用户/ [加密]
或
用户/ some_user
有没有办法在rails上做到这一点?
答案 0 :(得分:3)
使用固定链接而不是用户ID怎么样?即用户/ [永久链接],您可以将永久链接配置为您喜欢的任何内容,只要它是唯一值
查看friendly_id gem:https://github.com/norman/friendly_id
答案 1 :(得分:0)
在URL中显示对象时,Rails使用to_param
方法。
如果您更改to_param
中的user
方法,则会用于显示数据而不是id
。
默认情况下,rails已实现to_param
以返回对象的id
。
例如
class User < ActiveRecord::Base
...
def to_param
"#{self.first_name}-#{self.last_name}" # or whatever you want to use
end
...
end
在您的网址中,您将获得/users/first_name-last_name
或to_param
方法返回的任何内容。默认情况下,to_param
会返回id
,而url
会返回/users/4
。在您的控制器中,您可以找到user
id
4,但是当您更改to_param
方法时,您必须分别更改从数据库中获取用户的方式。
实施例:
我将to_param
方法更改为从数据库返回nick_name
,并且它对于特定用户是唯一的,我可以使用它从数据库中查找用户。
在路由器
更改params
get 'users/:nick_name', 'users#show'
在控制器中
User.find_by :nick_name => params[:nick_name]
答案 2 :(得分:0)
# app/models/secret.rb; this would go in the model you want to obfuscate
class Secret < ActiveRecord::Base
has_friendly_id :code, :use_slug => true
validates :name, :uniqueness => true
def code
Digest::SHA1.hexdigest self.name
end
end
这很简单。如果你的安全需求很严重,你可能想要一些更复杂的东西(更不用说比基本的混淆技术更多的分层),但我想分享一种开箱即用的方式来使用已经存在的宝石(甚至可能已在您的应用中使用)