0

我试图让管理员能够删除用户的帖子。这是我在 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

我可以让它为正确的用户工作,但不能为管理员工作。我收到此错误消息

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

我试图将 admin_user 定义为 user.id ==1 private

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

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

4

2 回答 2

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

升级版:

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

before_filter :admin_user?, only: :destroy
于 2013-03-16T18:00:33.930 回答
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? 从任何控制器调用,所以把它放在应用程序控制器中

于 2013-03-16T18:06:02.880 回答