ruby-on-railsruby-on-rails-3validationformwizard

undefined method `include?' for nil:NilClass with partial validation of wizard gem


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.


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
    # => []