Rails - 用户是模型的所有者吗?

时间:2014-01-10 01:07:53

标签: ruby-on-rails

检查当前对象是否属于当前用户的最佳方法是什么?

我想只允许删除所有者的权力,但我正在努力构建一个控制器功能来实现这一目标。

  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 允许任何已登录的用户进行删除。

3 个答案:

答案 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