2015-02-10 79 views

回答

3

如何使用永久链接而不是用户ID?即用户/ [永久链接]和可以配置永久链接任何你喜欢的,只要它是一个唯一的值

结帐的friendly_id宝石:https://github.com/norman/friendly_id

+0

使用随机(或伪随机)生成的唯一ID(friendly_id可以让你轻松做到)是我想的方法,如果你不想让人们能够猜测用户ID(这是我认为你所有你的数据库关联仍然会使用id,这只是使用随机查找slug的url。 – 2015-02-10 16:06:09

+0

是的,我想隐藏user_id – 2015-02-11 06:56:11

0

Rails使用to_param方法在URL显示对象时。

如果更改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。并在您的控制器中可以找到userid 4,但是当您更改to_param方法时,必须分别更改从数据库中获取用户的方式。

例如: 我更改我的to_param方法从数据库返回nick_name,它对于特定用户是唯一的,我可以使用它从数据库中查找用户。 在路由器

变化为params

get 'users/:nick_name', 'users#show' 

在控制器

User.find_by :nick_name => params[:nick_name] 
+0

好吧,当我在用户中添加此方法时模型,我得到一个错误“无法找到用户与'ID'=一些用户”,无论如何修复? – 2015-02-11 06:55:19

+0

你需要独特的价值与'to_param'方法返回,因为你会用它来找到用户在数据库。现在你的路由是'/ users/some-user',但是如何确定哪个用户是谁,你需要一些独特的参数来链接到特定的用户 – Nermin 2015-02-11 08:08:13

+0

现在我很困惑QQ – 2015-02-11 09:33:24

0

其他人一样在这个帖子里说,我使用 映射我使用 https://github.com/norman/friendly_id这样:

# 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 

很简单。如果你的安全需求是严重的,你可能会想要一些更复杂的东西(更不用说比基本的混淆技术更分层了),但我想分享一个开箱即用的方式来使用已存在的gem (甚至可能已经在您的应用程序中使用)