像这样在 url 中留下用户的数据库 ID 是不是一种不好的做法:
localhost:3000/users/16/edit
如果不好,我该如何隐藏 url 中的 id?调用视图中的路径、routes.rb 等时需要注意什么?
如果这与讨论相关,则用户资源在我的 routes.rb 中如下所示:
resources :users, only: [:new, :edit, :create, :update]
像这样在 url 中留下用户的数据库 ID 是不是一种不好的做法:
localhost:3000/users/16/edit
如果不好,我该如何隐藏 url 中的 id?调用视图中的路径、routes.rb 等时需要注意什么?
如果这与讨论相关,则用户资源在我的 routes.rb 中如下所示:
resources :users, only: [:new, :edit, :create, :update]
只需覆盖to_param
ActiveRecord::Base 子类
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
虽然您可以使用 hawk 和RailsCast #314: Pretty URLs with FriendlyId中描述的友好 id ,但在路由中使用主键是标准做法,甚至可能是最佳做法。您的主键可确保在调用“/posts/1/edit”时获取正确的记录。如果你使用蛞蝓,你必须自己确保这个蛞蝓的唯一性!
在您的特定情况下,您似乎正在构建某种“编辑配置文件”功能。如果每个用户只编辑他或她自己的个人资料,您可以路由Singular Resource。
Possible routes:
/profile # show profile
/profile/edit # edit profile
然后您的用户的主键将不会从 URL 中看到。在所有其他模型中,我更喜欢使用 URL 中的 id。
根据您的路线,您的用户似乎没有公开可见的个人资料。如果是这种情况,那么您可以简单地使用example.com/settings
Users#edit 和example.com/sign_up
Users#new。
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