Rails - 在数据库中保留数据库ID的不良做法?

时间:2013-08-07 07:05:23

标签: ruby-on-rails

将用户的数据库ID留在网址中是不好的做法,如下所示:

localhost:3000/users/16/edit

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

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

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

3 个答案:

答案 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