让两个任务调用相同的操作并且只希望将一个限制为current_user的问题

时间:2011-04-09 00:58:55

标签: ruby-on-rails ruby ruby-on-rails-3 controller action

我让用户编辑他们的视频并为视频添加标签。由于我在视频节目视图中设置了将标签添加为虚拟属性,因此两个任务都使用相同的控制器方法,即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

问题在于我只希望视频的所有者能够编辑自己的视频,而我希望任何用户都能更新标签。当两个任务都执行相同的操作时,是否可以执行此操作,还是需要重构我的应用程序?如果是这样,怎么样?

2 个答案:

答案 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