Ruby on rails 如何限制对编辑操作和通过URL输入的访问?
我有一个关系用户(“Desive”),有很多事件 我想阻止用户编辑不属于他们的事件,并通过输入类似于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
的内容来阻止用户访问编辑操作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
。