2012-10-14 72 views
0

我有Users有很多People有很多Projects如何確保用戶只能編輯自己的條目?

例如,一個新的項目,可以這樣創建:

def new 
    @project = Project.new(:person_id => params[:person_id]) 
    @title = "New project" 
end 

我怎樣才能確保用戶只能插入person_id這裏真正屬於他嗎?

回答

1

從會話(服務器端)獲得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 
+0

感謝您的幫助! – Tintin81

1

考慮使用隱式授權這一點。你的最終結果應該是這樣的:

# 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變量。每個控制器操作應負責共享資源或資源集合。

相關問題