我有Users
有很多People
有很多Projects
。如何確保用戶只能編輯自己的條目?
例如,一個新的項目,可以這樣創建:
def new
@project = Project.new(:person_id => params[:person_id])
@title = "New project"
end
我怎樣才能確保用戶只能插入person_id
這裏真正屬於他嗎?
我有Users
有很多People
有很多Projects
。如何確保用戶只能編輯自己的條目?
例如,一個新的項目,可以這樣創建:
def new
@project = Project.new(:person_id => params[:person_id])
@title = "New project"
end
我怎樣才能確保用戶只能插入person_id
這裏真正屬於他嗎?
從會話(服務器端)獲得user_id,但不是參數(客戶端),例如,
def new
@project = Project.new(:person_id => session[:current_user_id])
end
,或者使界面更加限制:
def new
@project = Project.create_for_current_user(session)
end
def Project.create_for_current_user(session)
return Project.new(:person_id => session[:current_user_id])
end
考慮使用隱式授權這一點。你的最終結果應該是這樣的:
# GET people/1/projects/new
def new
user = User.find(session[:current_user_id])
@project = user.people.find(params[:person_id]).projects.build(:title => "New Project")
end
# POST people/1/projects
def create
user = User.find(session[:current_user_id])
user.people.find(params[:person_id]).projects.create(params[...])
end
然後在routes.rb:
resources :people do
resources :projects
end
通過這種方法,新項目將自動歸於用戶。
在附註中,您應該考慮使用諸如Devise或before_filter之類的東西,以便您可以更方便地訪問當前用戶,而無需在每個操作中執行User.find
。
此外,您的控制器操作中不應該有額外的@title變量。每個控制器操作應負責共享資源或資源集合。
感謝您的幫助! – Tintin81