将用户的数据库ID留在网址中是不好的做法,如下所示:
localhost:3000/users/16/edit
如果不好,我该如何隐藏网址中的ID?在我的视图中调用路径时,我需要注意什么,routes.rb等?
如果这与讨论相关,则用户资源在我的routes.rb中显示如下:
resources :users, only: [:new, :edit, :create, :update]
答案 0 :(得分:3)
只需覆盖ActiveRecord :: Base子类中的to_param
class User < ActiveRecord::Base
validates_uniqueness_of :name
def to_param #overriden
name
end
end
然后像这样查询
user = User.find_by_name('Phusion')
user_path(user) # => "/users/Phusion"
或者您可以使用gem friendly_id
答案 1 :(得分:1)
虽然您可以使用hawk和RailsCast #314: Pretty URLs with FriendlyId所述的友好ID,但使用路线中的主键是标准做法,甚至是最佳做法。只要调用'/ posts / 1 / edit',您的主键就可以确保正在获取正确的记录。如果你使用slug,你必须自己确保这个slug的独特性!
在您的特定情况下,您似乎正在构建某种“编辑配置文件”功能。如果每个用户只想编辑自己的个人资料,您可以路由Singular Resource。
Possible routes:
/profile # show profile
/profile/edit # edit profile
然后,您的用户主键将无法从网址中看到。在所有其他模型中,我更愿意使用URL中的id。
答案 2 :(得分:0)
根据您的路线,您的用户看起来不会有公开可见的个人资料。如果是这种情况,那么您只需对用户#edit使用example.com/settings
,为用户#new使用example.com/sign_up
。
get 'settings', to: 'users#edit'
get 'sign_up', to: 'users#new'
resource :users, path: '', only: [:create, :update]
如果您的用户将来确实拥有公开可见的个人资料,那么您可以使用hawk建议的friendly_id gem,也可以通过在创建记录之前覆盖它来随机化7位ID。经过一番研究,这就是我最终做到的方式:
before_create :randomize_id
private
def randomize_id
self.id = loop do
random_id = SecureRandom.random_number(10_000_000)
break random_id unless random_id < 1_000_000 or User.where(id: random_id).exists?
end
end