Reputation: 1203
I keep getting undefined method on 2 columns first_name and last_name from the database when I try and run sunspot:reindex or in the Views of the Gears that belongs_to a user. It was working fine before installing devise. See my code below. Thanks for the help.
User Model
class User < ActiveRecord::Base
# 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 :email, :password, :password_confirmation, :remember_me, :first_name, :last_name, :userimage, :remove_userimage
has_many :gears
has_many :comments, :dependent => :destroy
has_one :store, :dependent => :destroy
require 'carrierwave/orm/activerecord'
mount_uploader :userimage, UserpicUploader
accepts_nested_attributes_for :store
email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :first_name, presence: true,
length: {:maximum => 50 }
validates :last_name, presence: true,
length: {:maximum => 50 }
def name
first_name + " " + last_name
end
Gear Model
class Gear < ActiveRecord::Base
attr_accessible :title, :size, :price, :sub_category_id, :user_id, :image, :image_a, :remote_image_url, :color, :year, :latefee, :cancellation, :minrental, :policy, :about, :address, :city, :state, :zip
belongs_to :user
belongs_to :sub_category
has_one :category, :through => :sub_category
has_many :comments, :dependent => :destroy
require 'carrierwave/orm/activerecord'
mount_uploader :image, GearpicUploader
mount_uploader :image_a, GearpicUploader
validates :title, presence: true
validates :size, presence: true
validates :price, presence: true
validates :sub_category_id, presence: true
validates :user_id, presence: true
searchable do
text :title, :size, :price, :year, :zip, :state, :city, :minrental, :about, :latefee, :color
text :user_first_name do
user.first_name
end
text :user_last_name do
user.last_name
end
# **Facet Section**
string :size, :price, :year, :zip, :state, :city, :minrental, :latefee, :color
string :sub_category_name do
sub_category.name
end
string :category_name do
category.name
end
end
end
Gear Controller Index & Show
class GearsController < ApplicationController
def index
@search = Gear.solr_search do
fulltext params[:search]
paginate(page: params[:page])
facet (:category_name)
facet (:sub_category_name)
with(:sub_category_name, params[:name]) if params[:name].present?
with(:category_name, params[:categoryname]) if params[:categoryname].present?
end
@gears = @search.results
end
def show
@gear = Gear.find(params[:id])
@storegear = @gear.user.gears.all(:order => 'created_at DESC', :limit => 6)
@comments = @gear.comments.all
@user = @gear.user
@store = @gear.user.store.id
end
Views I'm trying to show
<%= link_to gear_path(gear) do %>
<div class="gear_list_box">
<div class="gear_list_box_top"><%= image_tag gear.image_url(:list), class: 'gear_list_box_top_pic' %></div>
<div class="gear_list_box_bottom">
<table style="border-collapse:collapse; cellspacing: 0; width: 100%; margin: 0;" >
<tr>
<td style="color: #2c6aa7; padding-left: 10px" width="60%"> <span class='gearlist_size'><%= gear.size %></span> - <%= truncate(gear.title,:length => 12) %></td>
<td rowspan="2" width="40%" style="color: #5c8d0d; text-align: center; vertical-align: middle; font-size: 120%; border-collapse:collapse;">$<%= gear.price %>/day</td>
</tr>
<tr>
<td width="60%" style="padding-left: 10px; font-size: 12px;"><%= gear.user.first_name + " " + gear.user.last_name %></td>
</tr>
</table>
</div>
</div>
<% end %>
Routes
devise_for :users, :path => 'accounts', :controllers => {:registrations => "registrations"}
devise_scope :user do
get "signin", :to => "devise/sessions#new"
end
devise_scope :user do
post "sign_in", :to => "devise/sessions#create"
end
devise_scope :user do
delete "signout", :to => "devise/sessions#destroy"
end
devise_scope :user do
get "signup", :to => "devise/registrations#new"
end
resources :gears do
resources :comments, :only => [:create, :destroy]
end
match '/gear', to: "gears#index"
resources :users, :except => [:destroy, :create, :new ] do
resources :store
end
root to: 'pages#home'
match '/about', to: 'pages#about'
match '/contact', to: 'pages#contact'
match '/fees', to: 'pages#fees'
match '/faq', to: 'pages#faq'
match '/why', to: 'pages#why'
match '/signup', to: 'users#new'
match '/signin', to: 'sessions#new'
match '/signout', to: 'sessions#destroy'
end
Error*
rake sunspot:reindex --trace
** Invoke sunspot:reindex (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute sunspot:reindex
rake aborted!
undefined method `first_name' for nil:NilClass
/Users/dave/rails_projects/EquiptMe/app/models/gear.rb:21:in `block (2 levels) in <class:Gear>'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.1/lib/sunspot/util.rb:208:in `instance_eval'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.1/lib/sunspot/util.rb:208:in `instance_eval_with_context'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.1/lib/sunspot/util.rb:86:in `instance_eval_or_call'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.1/lib/sunspot/data_extractor.rb:33:in `value_for'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.1/lib/sunspot/field_factory.rb:58:in `populate_document'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.1/lib/sunspot/indexer.rb:95:in `block in prepare'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.1/lib/sunspot/indexer.rb:94:in `each'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.1/lib/sunspot/indexer.rb:94:in `prepare'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.1/lib/sunspot/indexer.rb:24:in `block in add'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.1/lib/sunspot/indexer.rb:24:in `map'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.1/lib/sunspot/indexer.rb:24:in `add'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.1/lib/sunspot/session.rb:91:in `index'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.1/lib/sunspot/session_proxy/abstract_session_proxy.rb:11:in `index'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.1/lib/sunspot.rb:184:in `index'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot_rails-1.3.1/lib/sunspot/rails/searchable.rb:256:in `block (2 levels) in solr_index'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot_rails-1.3.1/lib/sunspot/rails/searchable.rb:345:in `solr_benchmark'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot_rails-1.3.1/lib/sunspot/rails/searchable.rb:255:in `block in solr_index'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/activerecord-3.2.0/lib/active_record/relation/batches.rb:72:in `find_in_batches'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/activerecord-3.2.0/lib/active_record/querying.rb:8:in `find_in_batches'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot_rails-1.3.1/lib/sunspot/rails/searchable.rb:254:in `solr_index'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot_rails-1.3.1/lib/sunspot/rails/searchable.rb:198:in `solr_reindex'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot_rails-1.3.1/lib/sunspot/rails/tasks.rb:54:in `block (3 levels) in <top (required)>'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.1/lib/sunspot/class_set.rb:16:in `each'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.1/lib/sunspot/class_set.rb:16:in `each'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/sunspot_rails-1.3.1/lib/sunspot/rails/tasks.rb:53:in `block (2 levels) in <top (required)>'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `call'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `block in execute'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `each'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `execute'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:158:in `block in invoke_with_call_chain'
/Users/dave/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:151:in `invoke_with_call_chain'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:144:in `invoke'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:116:in `invoke_task'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `block (2 levels) in top_level'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `each'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `block in top_level'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:88:in `top_level'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:66:in `block in run'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:63:in `run'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/bin/rake:33:in `<top (required)>'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/bin/rake:19:in `load'
/Users/dave/.rvm/gems/ruby-1.9.3-p0/bin/rake:19:in `<main>'
Tasks: TOP => sunspot:reindex
Daves-MacBook-Pro:EquiptMe dave$
Upvotes: 0
Views: 1616
Reputation: 9884
Searchable is a block, so you can rewrite something like:
searchable do
text :title, :size # the rest...
text :user_first_name do
user.nil?? '' : (user.first_name.nil?? '' : user.first_name)
end
end
Worked for me.
Upvotes: 1
Reputation: 1203
I've fixed it. The problem was I had a Gear object without a User in my sample data. After I deleted the gear it worked fine.
Upvotes: 0
Reputation: 13414
Have you tried instead of referring to first_name
and last_name
through the gear model, accessing them through the current_user
reference made available by devise?
For example, changing your view to use this line might help:
current_user.first_name + " " + current_user.last_name
Once you begin using devise the best way to access the current user is via the current_user
convenience method.
Upvotes: 0