检查当前对象是否属于当前用户的最佳方法是什么?
我想只允许删除所有者的权力,但我正在努力构建一个控制器功能来实现这一目标。
before_filter :signed_in_user, only: [:create]
before_filter :correct_user, only: [:edit, :update, :destroy]
...
def destroy
@event = Event.find(params[:id])
if @event.present?
@event.destroy
end
redirect_to root_path
end
private
def signed_in_user
unless signed_in?
store_location
redirect_to signin_path, notice: "Please sign in."
end
end
def correct_user
@event = current_user.events.find_by_id(params[:id])
rescue
redirect_to root_path
end
我当前的 def correct_user 允许任何已登录的用户进行删除。
答案 0 :(得分:1)
您的correct_user
方法已经在执行您需要执行的操作:使用current_user.events.find
获取事件。您只需从destroy
方法中删除事件查找代码,它就可以正常运行。
答案 1 :(得分:1)
当我撰写评论时,您尚未添加destroy
操作代码。仔细查看correct_user
方法:
def correct_user
@event = current_user.events.find_by_id(params[:id])
rescue
redirect_to root_path
end
在那里,您正在检索事件并将其存储在实例变量中。更重要的是,您正在通过current_user
检索事件。所以它的范围是current_user
,只有current_user
拥有的事件才会被曝光。
@event = current_user.events.find_by_id(params[:id])
请注意,correct_user
设置在before_filter
中,因此它会在destroy
操作之前运行。
因此,在请求到达destroy
操作时,事件已存储在实例变量(@event
)中。因此,您已经有了一个事件对象供您使用。你可以参考一下。无需再次检索它。
def destroy
@event = Event.find(params[:id]) #<- This line is redundant (and dangerous in this case)
... # snip
end
将destroy方法更改为此。
def destroy
redirect_to root_path if @event.destroy
end
答案 2 :(得分:0)
我正准备添加类似的功能!您必须检查当前用户是否已登录,以及他们的ID =对象的user_id。
像
这样的东西 event = Event.find(params[:id])
if event.user_id == current_user.id
event.destroy
else
redirect_to :root, :notice => "You do not have permissions."
end