如何定义admin_user来删除帖子? Ruby on rails app

时间:2013-03-16 17:37:59

标签: ruby-on-rails ruby

我正在尝试让管理员能够删除用户的帖子。 这是我在post.html.erb中使用的代码

<% if current_user.admin? %>
    <%= link_to "delete", post, method: :delete %>
  <% end %>

这就是我在控制器中的内容

class PostsController < ApplicationController
  before_filter :signed_in_user
  before_filter :admin_user, only: :destroy
  before_filter :correct_user, only: :destroy


def destroy
    @post.destroy
    redirect_to root_path
  end

  private

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

我能够让它为correct_user工作,但不能用于管理员。我收到此错误消息

undefined local variable or method `admin_user' for #<PostsController:0x5fda230>

我尝试将admin_user定义为user.id == 1     私人

def admin_user?
      current_user && current_user.id == 1
    end

但我遇到了同样的错误信息。

2 个答案:

答案 0 :(得分:0)

class ApplicationController < ActionController::Base
  def admin_user?
    unless current_user && current_user.admin?
      redirect_to root_url
      return false
    end
  end
end

class PostsController < ApplicationController
  before_filter :signed_in_user
  # before_filter :admin_user?, only: :destroy
  before_filter :load_post, :only: :destroy

  def destroy
    @post.destroy
    redirect_to root_url
  end

  private
    def load_post
      @post = current_user.admin? ? Post.find(params[:id]) : current_user.posts.find(params[:id])
    end
end

UPD:

正如我从评论中所理解的那样,您希望用户能够销毁自己的帖子和管理员以便能够销毁任何帖子。在这种情况下,您不必检查before_filter中的用户admin,例如删除这一行:

before_filter :admin_user?, only: :destroy

答案 1 :(得分:0)

before_filter :admin_user, only: :destroy

class ApplicationController
  def admin_user?
    if current_user && current_user.id == 1
      return true
    else 
      redirect_to root_url, :error => "Admin only"
      return false
    end
  end
end

自admin_user以来?从任何控制器调用,所以把它放在应用程序控制器