3

像这样在 url 中留下用户的数据库 ID 是不是一种不好的做法:

localhost:3000/users/16/edit

如果不好,我该如何隐藏 url 中的 id?调用视图中的路径、routes.rb 等时需要注意什么?

如果这与讨论相关,则用户资源在我的 routes.rb 中如下所示:

resources :users, only: [:new, :edit, :create, :update]
4

3 回答 3

4

只需覆盖to_paramActiveRecord::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

于 2013-08-07T07:20:58.203 回答
1

虽然您可以使用 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。

于 2013-08-07T07:39:57.307 回答
0

根据您的路线,您的用户似乎没有公开可见的个人资料。如果是这种情况,那么您可以简单地使用example.com/settingsUsers#edit 和example.com/sign_upUsers#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  
于 2013-08-07T07:43:19.907 回答