Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何限制对编辑操作和通过URL输入的访问?_Ruby On Rails_Ruby_Ruby On Rails 3_Devise - Fatal编程技术网

Ruby on rails 如何限制对编辑操作和通过URL输入的访问?

Ruby on rails 如何限制对编辑操作和通过URL输入的访问?,ruby-on-rails,ruby,ruby-on-rails-3,devise,Ruby On Rails,Ruby,Ruby On Rails 3,Devise,我有一个关系用户(“Desive”),有很多事件 我想阻止用户编辑不属于他们的事件,并通过输入类似于的内容来阻止用户访问编辑操作http://localhost:3000/events/65/edit“进入浏览器 我还想将用户重定向回他们在单击编辑事件链接时所在的页面 我尝试了以下两种方法,但都没有成功: def edit if current_user == @event.user_id @event = Event.find(params[:id]) else red

我有一个关系用户(“Desive”),有很多事件

我想阻止用户编辑不属于他们的事件,并通过输入类似于
的内容来阻止用户访问编辑操作http://localhost:3000/events/65/edit“
进入浏览器

我还想将用户重定向回他们在单击编辑事件链接时所在的页面

我尝试了以下两种方法,但都没有成功:

def edit
  if current_user == @event.user_id
    @event = Event.find(params[:id])
  else
    redirect_to events_path
  end

  def edit
    @event = Event.find(params[:id])
    unless session[:id] == @event.user_id
      redirect_to events_path
      return
    end
  end

尝试添加before筛选器(如果需要,也可用于其他操作):


尝试添加before筛选器(如果需要,也可用于其他操作):


如果您在此控制器中只需要此类授权逻辑,则可以执行以下操作:

class User < ActiveRecord::Base
  has_many :events
end

class EventsController < ApplicationController
  def edit
    @event = current_user.events.find(params[:id])
  rescue ActiveRecord::RecordNotFound
    redirect_to events_path, notice: "You cannot edit this event."
  end
end
class用户
救援区实际上是可选的。如果您将其删除,如果用户访问未创建事件的编辑URL,则会收到
404notfound
错误消息


如果您希望在应用程序中使用其他地方的授权,我建议您进行调查。它是一个gem,用于在一个能力类中对授权和访问规则进行语句化。

如果您在此控制器中只需要这种授权逻辑,则可以执行以下操作:

class User < ActiveRecord::Base
  has_many :events
end

class EventsController < ApplicationController
  def edit
    @event = current_user.events.find(params[:id])
  rescue ActiveRecord::RecordNotFound
    redirect_to events_path, notice: "You cannot edit this event."
  end
end
class用户
救援区实际上是可选的。如果您将其删除,如果用户访问未创建事件的编辑URL,则会收到
404notfound
错误消息


如果您希望在应用程序中使用其他地方的授权,我建议您进行调查。这是一个在能力类中对授权和访问规则进行语句化的宝石。

第一个方法背后的想法很好,但这种比较总是失败的
当前用户
是用户对象
@event.user_id
是一个整数(或者可能是某种形式的UUID)

您需要将用户对象与用户对象进行比较:

if current_user == @event.user
或从一个ID到一个ID:

if current_user.id == @event.user_id

第一种方法背后的想法很好,但这种比较总是失败的
当前用户
是用户对象
@event.user_id
是一个整数(或者可能是某种形式的UUID)

您需要将用户对象与用户对象进行比较:

if current_user == @event.user
或从一个ID到一个ID:

if current_user.id == @event.user_id

我澄清了你的问题,使它更具可读性。你的代码无效。第一个
编辑
缺少结尾
结尾
。我整理了你的问题,使其更具可读性。你的代码无效。第一个
edit
缺少结束
end
。我认为您应该继续在
edit
方法中设置@event。在before_过滤器中隐藏实例变量是一种有争议的做法,但如果有人这样做,那么所有控制器操作都应该一致地隐藏实例变量。我想象这个过滤器将用于事件控制器(如show)上的多个成员操作。如果只为
edit
执行此操作,则整个逻辑可以移动到编辑操作本身。问题是方法名称
check\u user
并不意味着它做了什么。在过滤器之前单独设置一个
find\u事件
,在过滤器之前设置一个
authorize\u access
。我认为您应该继续在
edit
方法中设置@event。在before_过滤器中隐藏实例变量是一种有争议的做法,但如果有人这样做,那么所有控制器操作都应该一致地隐藏实例变量。我想象这个过滤器将用于事件控制器(如show)上的多个成员操作。如果只为
edit
执行此操作,则整个逻辑可以移动到编辑操作本身。问题是方法名称
check\u user
并不意味着它做了什么。在\u筛选器之前单独设置一个
find\u事件
,在\u筛选器之前设置一个
authorize\u access