Проблема с двумя задачами, вызывающими одно и то же действие, и хочу, чтобы только одна была ограничена current_user - PullRequest
0 голосов
/ 09 апреля 2011

Я позволяю пользователям редактировать свои видео и добавлять теги к видео.Поскольку я настроил добавление тегов в качестве виртуального атрибута в представлении видео-шоу, обе задачи используют один и тот же метод контроллера, метод обновления 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 голосов
/ 09 апреля 2011

Для начала вам нужно убедиться, что вы заблокировали это в браузере.Для пользователя может быть затруднительно иметь возможность редактировать материал и затем получать ошибку, потому что он не является владельцем.

Во-вторых, чтобы защитить себя от взлома, внутри вашего контроллера вам нужно сделать что-то вроде:

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 голосов
/ 09 апреля 2011

Я исправил вашу проблему в IRC. Дайте мне очки, или я буду смеяться над вами в другом месте.

...