如何在before_filter中运行两个方法?

时间:2012-05-15 04:35:45

标签: ruby-on-rails before-filter

我的邮政控制器代码如下。我想要做的是用户应该能够删除自己的帖子,admin_user可以删除任何帖子。以下代码使admin_user可以删除帖子,但对于普通用户,当尝试删除自己的帖子时,它会重定向到root_path

似乎do_authentication无法正常运行,普通用户尝试以管理员身份进行身份验证而不是“correct_user”

可能出现什么问题?

谢谢!

class PostsController < ApplicationController
  before_filter :signed_in_user, only: [:index, :create, :destroy]
  before_filter :do_authentication,  only: :destroy
  .
  .
  .
def destroy
  @post.destroy
  flash[:success] = "Post deleted!"
  redirect_back_or user_path(current_user)
end

private
  def do_authentication
    correct_user || admin_user
  end

  def correct_user
    @post = current_user.posts.find_by_id(params[:id])
    redirect_to user_path(current_user) if @post.nil?
  end

  def admin_user
    @post = Post.find_by_id(params[:id])
    redirect_to(root_path) unless current_user.admin?
  end

2 个答案:

答案 0 :(得分:0)

首先,我建议使用cancan进行授权。 我认为你的问题是correct_user的返回值。你无法控制它。如果该方法返回的计算结果为false,则do_authentication方法也将调用admin_user。同时查看您的代码似乎管理授权也不起作用......

试试这个:

def do_authentication
  @post = Post.find_by_id(params[:id])
  redirect_to redirect_location unless current_user.admin? or @post.user == current_user
end

def redirect_location
  return "redirect_location_for_admin" if current_user.admin?
  return "redirect_location_for_non_admins"
end

答案 1 :(得分:0)

方法correct_user,admin_user将为所有用户执行,无论他们的角色如何,因为您在调用方法时没有检查任何条件。需要改进代码以解决您的问题。

def do_authentication
  if current_user.admin?
    @post = Post.find_by_id(params[:id])
  else
    @post = current_user.posts.find_by_id(params[:id])
    redirect_to user_path(current_user), :notice => "Access denied" unless @post
  end
end