Vieenay Siingh
Vieenay Siingh

Reputation: 867

NoMethodError in Articles#index undefined method `is_admin' for nil:NilClass

I am trying to implement some conditions in views like "Edit" and "Delete" button should be visible only if current user is Admin for my application. When i try to <% if current_user.is_admin %> in my articles/index.html.erb page, I get undefined method "is_admin" error.

Can not I use current_user method of devise within article index page to get user? Please suggest me how to get user and then check if user is admin or not.

My code file are below:

articles/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

User table

 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

Upvotes: 1

Views: 1561

Answers (2)

scones
scones

Reputation: 3345

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

If the page could potentially not have a current_user set then:

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

or maybe in your case

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

This should work, when there is no current user (ie. not logged in)

Upvotes: 1

ply
ply

Reputation: 1141

Does your User model have an admin attribute?

If not tou need to define one, e.g

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

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

Then run rake db:migrate

You should then be able to check if a user is admin by calling:

current_user.admin?

There are other options to do this as well in devise, check them out here

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

Upvotes: 0

Related Questions