1

我有一个有很多事件的关系用户(“设计”)。

我想阻止用户编辑不属于他们的事件,并通过'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
4

3 回答 3

3

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

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

救援块实际上是可选的。如果您删除它,如果用户404 Not found访问不是她创建的事件的编辑 URL,她将收到一条错误消息,

如果您希望在应用程序的其他地方使用授权,我建议您查看CanCan。它是一个将授权和访问规则集中在能力类中的宝石。

于 2013-11-01T14:34:31.007 回答
2

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

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

if current_user == @event.user

或者一个 ID 到一个 ID:

if current_user.id == @event.user_id
于 2013-11-01T15:35:36.743 回答
2

尝试添加一个前置过滤器(如果需要,它也可以用于其他操作):

 before_filter :check_user, :only => [:edit]

 def check_user
    @event = Event.find(params[:id])
    unless current_user.id == @event.user_id
       redirect_to (request.referrer || root_path)
       return
    end
 end
于 2013-11-01T14:30:41.803 回答