我让用户编辑他们的视频并为视频添加标签。由于我在视频节目视图中设置了将标签添加为虚拟属性,因此两个任务都使用相同的控制器方法,即videos_controller更新方法:
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 :(得分:0)
我在IRC中修复了你的问题。给我点数,否则我会在别处取笑你。
答案 1 :(得分: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