如何限制某人访问他尚未创建的数据? (红宝石)

时间:2015-10-15 14:59:23

标签: ruby-on-rails ruby devise scaffold

我正在使用Ruby on rails with devise。 我生成了一个脚手架。

tasks_controller.rb:

def index
   @tasks= current_user.tasks
end

通过使用它,我只能向人们展示他们创造的东西, 但是其他用户可以看到他们没有输入的任务数据,例如:

GET /tasks/1
GET /tasks/2

尽管current_user未创建ID为1的任务,但用户可以访问该任务。

3 个答案:

答案 0 :(得分:2)

是的,您可以使用过滤器限制此操作,例如

 class TasksController < ApplicationController
    before_filter :user_can_view_task, only: :show

    def show
       #you do not need to set @task here as it will be set by the filter method
    end

    private
       def user_can_view_task
          @task = Task.find(params[:id])
          unless @task.user_id == current_user.id
            flash[:notice] = "You may only view Tasks you have created."
            redirect_to(tasks_path)
          end 
       end
 end

每次用户点击节目视图的路线时,它都会在渲染视图之前执行此方法。 (因此“之前”)

此方法将查找任务并确定current_user是否创建了任务(假设User和Task之间的关联)。如果用户不是任务创建者,它会将它们重定向回索引视图,并告知他们只能查看他们创建的任务,而不是允许他们访问该节目。

答案 1 :(得分:0)

尝试:

def show
  @task = current_user.tasks.find(params[:id])
  # or with error handling
  # begin
  #   @task = current_user.tasks.find(params[:id])
  # rescue
  #   redirect_to [:tasks], flash: { error: 'not authorized' }
  #   return
  # end
end

答案 2 :(得分:0)

对于这些案例,有Pundit gem(https://github.com/elabs/pundit)。您的代码将显示:

class TaskPolicy
  attr_reader :user, :task

  def initialize(user, task)
    @user = user
    @task = task
  end

  def show?
    user.tasks.include? task
  end
end

你控制员的行动:

def show
  @task = Task.find(params[:id])
  authorize @task
  ...
end

如果当前用户尚未确定任务

,此操作将引发Pundit :: NotAuthorizedError