2013-08-07 40 views
3

它是一個不好的做法,讓用戶的數據庫ID在這樣的網址:Rails - 糟糕的做法離開數據庫ID在網址?

localhost:3000/users/16/edit 

如果它是壞的,我怎麼能隱藏在URL中的ID?在我的視圖中調用路徑時,我需要注意什麼,routes.rb等?

如果這是相關的討論中,用戶資源看起來像這樣在我的routes.rb:

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

如果你覺得在顯示數據庫ID風險,然後用'slugify' –

回答

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) # => "https://stackoverflow.com/users/Phusion" 

或者,您可以使用寶石friendly_id

1

雖然您可以使用友好的ids,如鷹和RailsCast #314: Pretty URLs with FriendlyId,在您的路線中使用主鍵是標準做法,甚至可能是最佳做法。您的主鍵可確保每次調用「/ posts/1/edit」時正在獲取正確的記錄。如果你使用slu,,你必須確保這個非常獨特的slu yourself!

在您的具體情況下,似乎您正在構建某種「編輯配置文件」功能。如果每個用戶只編輯他或她自己的配置文件,則可以路由Singular Resource

Possible routes: 
/profile # show profile 
/profile/edit # edit profile 

然後,您的用戶的主鍵將不會從URL中可見。在所有其他模型中,我寧願使用URL中的id。

+0

如果我改變了它在我的路線,'得到「個人資料」,到:'users#edit'',我仍然會在我的url helper中調用edit_user_path(@user)嗎? – user2345093

+0

在終端中運行'rake routes'來查看當前定義的路線。請參閱[命名路線](http://guides.rubyonrails.org/routing.html#naming-routes)以添加或覆蓋名稱。 –

0

根據您的路線,它看起來像您的用戶將不會公開可見的配置文件。如果是這種情況,那麼您可以簡單地將example.com/settings用於用戶#編輯並將example.com/sign_up用於用戶#新。

get 'settings', to: 'users#edit' 
    get 'sign_up', to: 'users#new' 
    resource :users, path: '', only: [:create, :update] 

如果您的用戶的確會在未來公開可見的配置文件,然後你可以使用friendly_id寶石的建議由鷹或者一個隨機的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