2011-04-09 45 views
0

我允許用戶編輯他們的視頻併爲視頻添加標籤。由於我設置了添加的標籤,在視頻顯示視圖中的虛擬屬性,這兩個任務擊中同一控制器的方法,該videos_controller更新方法:有兩個任務調用同一個動作並且只希望限制爲一個current_user的問題

def update 
    @video = current_user.videos.find(params[:id]) 

    respond_to do |format| 
     if @video.update_attributes(params[:video]) 
     format.html { redirect_to(@video) } 
     format.js 
     else 
     format.html { render :action => "edit" } 
     end 
    end 
    end 

的問題是,我只希望影片的擁有者是能夠編輯自己的視頻,而我希望標籤可以被任何用戶更新。當兩個任務都執行相同操作時是否可以執行此操作,還是需要重新構建應用程序?如果是這樣,怎麼樣?

回答

0

我修復了IRC中的問題。給我點,否則我會在別處取笑你。

+0

哈哈哪裏是在其他地方? – 2011-04-09 01:19:16

0

首先,您需要確保在瀏覽器中阻止此操作。 如果用戶能夠編輯內容然後得到錯誤,這會讓用戶感到困惑,因爲他不是所有者。

其次,保護自己不被篡改,控制器裏面,你需要做的是這樣的:

def update 
    @video = current_user.videos.find(params[:id]) 

    video_params = params[:video] 
    unless current_user = @video.user_id 
    # strip out all harmful parameters 
    # this is an example, as i don know 
    video_params.delete(:file_name) 

    # maybe here you should do some check if there is anything left? 
    # to generate an appropriate error? 
    end 

    respond_to do |format| 
    if @video.update_attributes(video_params) 
     format.html { redirect_to(@video) } 
     format.js 
    else 
     format.html { render :action => "edit" } 
    end 
    end 
end 
+0

我不認爲這回答了我的問題。這些代碼是完全保護我的嗎? – 2011-04-09 08:37:51

+0

嗨賈斯汀:如果用戶不是視頻的所有者,它會從參數中刪除屬性,只更新所有者可以更新的東西。我不知道哪些參數當然可以,所以我想例如':filename'。如果不知道你發送給控制器的參數。我假設用戶可以同時更新標籤和視頻(因爲代碼相同)。如果用戶沒有權限:從接收的參數中刪除「不允許的」屬性。 – nathanvda 2011-04-10 08:20:19

相關問題