我允许用户编辑他们的视频并为视频添加标签。由于我将添加标签设置为视频显示视图中的虚拟属性,因此两个任务都命中了相同的控制器方法,即videos_controller update方法:
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
问题是,我只希望视频的所有者能够编辑自己的视频,而我希望任何用户都可以更新标签。是否有可能做到这一点,当两个任务击中相同的行动,或者我需要重组我的应用程序?如果有,怎么做?
我在IRC中修复了您的问题。把分数给我,不然我在别的地方取笑你。
首先,您需要确保在浏览器中阻止此操作。如果一个用户能够编辑内容,然后得到一个错误,这会让他感到困惑,因为他不是所有者。
其次,为了保护自己不被篡改,你需要在你的控制器中做这样的事情: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