2013-08-05 11 views
8

Sto cercando di seguire la guida per la convalida parziale sull'oggetto utilizzando la gemma della procedura guidata, ma continuo a ricevere l'errore undefined metodo 'include?' per niente: NilClass, non capisco cosa c'è che non va, hanno provato a seguire le istruzioni passo passo.metodo non definito `include? ' per nil: NilClass con convalida parziale del wizard gemma

L'errore nel registro mostra.

NoMethodError - undefined method `include?' for nil:NilClass: 
app/models/property.rb:22:in `active_or_tenants?' 

Ecco i miei passi 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 

Fatemi sapere se avete bisogno di qualunque altre parti aggiunte alla domanda. Grazie in anticipo.

+0

Da quale riga deriva l'errore? – MrYoshiji

+0

riga 22 in property.rb NoMethodError - metodo non definito 'include? ' per nil: NilClass: app/models/property.rb: 22: in 'active_or_tenants? ' – cyclopse87

+0

Oh! Vedo ... Lo stato è in realtà una colonna (attributo) della classe Proprietà, giusto? Se sì, quindi sostituire 'status.include? ('Inquilini') || attivo? 'con' (stato || '') .include? ('inquilini') || attivo? ' – MrYoshiji

risposta

5

Dalle mie osservazioni:

Il status è un attributo del modello di proprietà. Può essere nil che genera un errore in alcuni casi:

undefined method include?' for nil:NilClass 

E 'in realtà cercando di confrontare nil-'tenants' (String).

di fissare tale, è possibile utilizzare uno stringa vuota da confrontare se status è nil,

# an example (you can try in your IRB console): 
nil || "No value" 
# => returns "No value" 

nel tuo caso:

def active_or_tenants? 
    status.to_s.include?('tenants') || active? 
end 

nil.to_s ritorno una stringa vuota. Che risolve il problema;)


In realtà, i metodi to_s, to_i, to_f ecc sono spesso usato per rimuovere l'eventuale 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 
# => [] 
+0

Sto seguendo questa guida \t goo.gl/mKDxey alla convalida parziale di oggetti che utilizzano la gemma della procedura guidata, pensi che ciò continuerebbe a rendere valida la convalida parziale? – cyclopse87

+0

Sì perché restituirà la stessa cosa, Il tutorial non sta gestendo il possibile valore nullo per la colonna "stato" – MrYoshiji

+0

Ho capito, grazie per l'aiuto. – cyclopse87

1

C'è un'altra soluzione a questo, si potrebbe desiderare per impostare uno stato predefinito sulla creazione dell'oggetto, preferibile nella migrazione.

class AddStatusToProperties < ActiveRecord::Migration 
    def change 
    create_table :projects do |t| 
     t.string :status, default: 'new' 
    end 
    end 
end 

A seguito di questo non dovrete mai nil per il tuo stato

1

In Ruby 2.3 è possibile utilizzare il safe navigation operator, che si limiterà a restituire nil quando l'oggetto è nullo e non genera un errore.

def active_or_tenants? 
    status&.include?('tenants') || active? 
end 
+0

l'attributo 'status' non è un array ma una stringa. – MrYoshiji

+0

Grazie [MrYoshiji] (http://stackoverflow.com/users/976775/mryoshiji), non so come mi sia mancato, aggiornerò la mia risposta. –

Problemi correlati