undefined method `include?' for nil:NilClass with partial validation of wizard gem
formwizard, ruby-on-rails, ruby-on-rails-3, validation
Solution
From my comments:
The `status` is an attribute of your Property model. It can be `nil` which raises an error in certain cases:
undefined method include?' for nil:NilClass
It is actually trying to compare `nil` to `'tenants'` (String).
To fix that, you can use an empty string to be compared if `status` is `nil`,
# an example (you can try in your IRB console):
nil || "No value"
# => returns "No value"
in your case:
def active_or_tenants?
status.to_s.include?('tenants') || active?
end
`nil.to_s` return an empty string. Which solves your problem ;)
Actually, the methods `to_s`, `to_i`, `to_f` etc. are often used to remove the possible `nil`:
# in ruby console:
2.3.3 :018 > nil.to_i
# => 0
2.3.3 :019 > nil.to_f
# => 0.0
2.3.3 :020 > nil.to_s
# => ""
2.3.3 :021 > nil.to_a
# => []
Problem
I am trying to follow the guide for partial validation on object using the wizard gem, but I keep getting the error undefined method `include?' for nil:NilClass, cant understand what is wrong, have tried to follow the step by step instructions. The error in the log shows. ``` NoMethodError - undefined method `include?' for nil:NilClass: app/models/property.rb:22:in `active_or_tenants?' ``` Here is my steps controller. ``` class Properties::BuildController < ApplicationController include Wicked::Wizard steps :tenant, :confirmed def show @property = Property.find(params[:property_id]) @tenants = @property.tenants.new(params[:tenant_id]) render_wizard end def update @property = Property.find(params[:property_id]) params[:property][:status] = step.to_s params[:property][:status] = 'active' if step == steps.last @property.update_attributes(params[:property]) render_wizard @property end def create @property = current_user.properties.build(params[:property]) logger.info @property.attributes if @property.save flash[:success] = "Tenant Added" redirect_to wizard_path(steps.second, :property_id => @property.id) else render 'edit' end end end ``` Property.rb ``` class Property < ActiveRecord::Base attr_accessible :name, :address_attributes, :tenants_attributes, :property_id, :status belongs_to :user has_one :address, :as => :addressable accepts_nested_attributes_for :address, :allow_destroy => true has_many :tenants accepts_nested_attributes_for :tenants, :allow_destroy => true validates :name, :presence => true validates :address, :presence => true validates :tenants, :presence => true, :if => :active_or_tenants? def active? status == 'active' end def active_or_tenants? status.include?('tenants') || active? end end ``` Let me know if you need any other parts added to the question. Thanks in advance.