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

私はそれを correct_user に対しては機能させることができますが、管理者に対しては機能させません。このエラーメッセージが表示されます

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

UPD:

コメントから理解したように、ユーザーが自分の投稿を破棄できるようにし、管理者がすべての投稿を破棄できるようにする必要があります。この場合、before_filterのuser 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 に答える