1

I've build my own basic blog-tool with Rails 3.1 based upon http://ruby.railstutorial.org/ruby-on-rails-tutorial-book and with the authorization presented in RailsCast 274 ( http://railscasts.com/episodes/274-remember-me-reset-password ). So I have a current_user for my session-management in my Rails-app that looks like this:

def current_user
  @current_user ||= User.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
end

Now I've got the problem, that I would like to check two values of this user.

My user-model looks like this:

# == Schema Information
#
# Table name: users
#
#  id              :integer         not null, primary key
#  name            :string(255)
#  email           :string(255)
#  password_digest :string(255)
#  admin           :boolean         default(FALSE)
#  created_at      :datetime
#  updated_at      :datetime
#  auth_token      :string(255)
#  writer          :boolean         default(FALSE)
#  website         :string(255)
#

class User < ActiveRecord::Base
  attr_accessible :name, :email, :website, :password, :password_confirmation
  has_secure_password

  has_many :articles, :dependent => :destroy

  email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  website_regex = /(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/ix

  validates :name, :presence => true,
                   :length   => { :maximum => 50 }
  validates :email, :presence => true,
                    :format   => { :with => email_regex },
                    :uniqueness => { :case_sensitive => false }
  # Automatically create the virtual attribute 'password_confirmation'.
  validates :password, :presence     => true,
                       :confirmation => true,
                       :length       => { :within => 6..40 }
  validates :website, :format => { :with => website_regex }

  before_create { generate_token(:auth_token) }

  private              
    def generate_token(column)
      begin
        self[column] = SecureRandom.urlsafe_base64
      end while User.exists?(column => self[column])
    end
end

The values I want to check are :admin and :writer, if they are true or not. As you can see, they are not marked as accessible because I want that only administrators can edit these values. I solve this like in RailsCast 237 (I would like to insert the link, but I'm not allowed as a new user to post more than two links) shown. Checking these parameters in controllers with current_user.admin? or current_user.writer? seems to be no problem. But if try this in a view I get the following error-message:

ActionView::Template::Error (undefined method `writer' for nil:NilClass):
    15:       <li><%= link_to "Log in", signin_path %></li>
    16:       <% end %>
    17:     </ul>
    18:     <% if current_user.writer == true %>
    19:     <ul>
    20:       <li><%= link_to "new article", newarticle_path %></li>
    21:     </ul>
  app/views/layouts/_header.html.erb:18:in `_app_views_layouts__header_html_erb___3376819447841576130_36475600'
  app/views/layouts/application.html.erb:12:in `_app_views_layouts_application_html_erb__676755681270806253_35068900'

Could please someone tell me if this problem is solvable and how? I would appreciate that very much!

Update 1: I figured out, that current_user.admin? or current_user.writer? don't work in controllers either. So it seems I need a general helper-method for that.

NordishBen
  • 77
  • 7

1 Answers1

1

this error means that you are not logged in. There is noting in 'current_user' variable.

you need to add another check whether the user logged-in or not.

so try this.

<% if current_user %>
  <% if current_user.writer %> 
  <% end %>
  #this will return true no need for doing current_user.writer == true
<% end %>

hope this will help

Muhammad Sannan Khalid
  • 3,127
  • 1
  • 22
  • 36