文章中的NoMethodError #index undefined方法`is_admin'代表nil:NilClass

时间:2013-04-04 19:13:11

标签: ruby-on-rails ruby devise admin

我正在尝试在视图中实现某些条件,例如“编辑”和“删除”按钮只有当前用户是我的应用程序的管理员时才可见。当我尝试<%if current_user.is_admin%>在我的文章/ index.html.erb页面中,我得到未定义的方法“is_admin”错误。

我不能在文章索引页面中使用current_user设计方法来获取用户吗?请建议我如何获取用户,然后检查用户是否是管理员。

我的代码文件如下:

物品/ index.html.erb

<%- model_class = Article -%>
<div class="">
  <h1><%=t '.title', :default => model_class.model_name.human.pluralize %></h1>
</div>

<div style="border: 1px solid #1763A4;border-radius: 4px 4px 4px 4px;margin: 0 0 20px; padding: 20px 20px 10px;">

    <% @articles.each do |article| %>
    <div style="border: 1px solid #51702E;border-radius: 4px 4px 4px 4px;margin: 0 0 20px; padding: 20px 20px 10px;">
       <div style="color:#51702E"><h2><%= article.title %></h2></div>
       <div style="color:#666666"> <%= article.created_at %></div> 
       <% if current_user.is_admin %> 
       <div> <%= truncate(article.body, :length => 500, :separator => ' ') %></div>  
     <%= link_to "edit",edit_article_path(article), :class => 'btn btn-warning btn' %>
     <%= link_to "delete",article_path(article),:method => :delete,:confirm => 'Are you sure?',:class => 'btn  btn-danger' %>
     <% end %>
     <%= link_to "VIEW MORE...",article_path(article), :class => 'btn btn-primary' %> 
     </li>
     </div>
    <% end %>
<%= link_to "Create new Article", new_article_path, :class => 'btn btn-large btn-primary' %>

articles_controller.rb

class ArticlesController < ApplicationController
    def index
        @articles = Article.all
    end

    def show
      @article = Article.find(params[:id])
    end

    def new
      @article = Article.new
    end

    def create
      @article = Article.new(params[:article])

      @article.save
      redirect_to article_path(@article)
    end

    def destroy
      @article = Article.find(params[:id])
      @article.destroy
      redirect_to action:  'index'  
    end

    def edit
      @article = Article.find(params[:id])
    end

    def update
      @article = Article.find(params[:id])
      @article.update_attributes(params[:article])
      flash.notice = "Article '#{@article.title}' Updated!"
      redirect_to article_path(@article)
     end
end

model:article.rb

class Article < ActiveRecord::Base
   attr_accessible :title, :body
   has_many :comments
   belongs_to :user
end

user.rb

class User < ActiveRecord::Base
    has_many :articles
    has_many :comments
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :username, :email, :password, :password_confirmation, :remember_me
   attr_accessible :title, :body
end

用户表

 create_table "users", :force => true do |t|
    t.string   "email",                  :default => "", :null => false
    t.string   "encrypted_password",     :default => "", :null => false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          :default => 0
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.boolean  "is_admin"
    t.boolean  "is_active"
    t.datetime "created_at",                             :null => false
    t.datetime "updated_at",                             :null => false
    t.string   "username"
  end

2 个答案:

答案 0 :(得分:1)

来自https://github.com/plataformatec/devise/wiki/How-To:-Add-an-Admin-role

  

如果页面可能没有设置current_user,那么:

if current_user.try(:admin?)
  # do something
end

或者在你的情况下

if current_user.try(:is_admin)
  # do something
end

当没有当前用户(即未登录)

时,这应该有效

答案 1 :(得分:0)

您的用户模型是否具有admin属性?

如果不是需要定义一个,例如

class AddAdminToUsers < ActiveRecord::Migration
  def self.up
    add_column :users, :admin, :boolean, :default => false
  end

 def self.down
   remove_column :users, :admin
 end
end

然后运行rake db:migrate

然后,您应该可以通过以下方式检查用户是否为管理员:

current_user.admin?

还有其他选择可以在设计中执行此操作,请在此处查看

https://github.com/plataformatec/devise/wiki/How-To:-Add-an-Admin-role