2015-11-03 7 views
1

Я хотел перейти от state_machine к state_machines. Когда я начал это делать, я обнаружил, что состояние больше не меняется от исходного состояния.Валидация при обновлении до состояния_машины gem

рассмотрели некоторые StackOverflow и другие руководства: -

Так что изменения я сделал:

  1. с использованием государственных машины-ActiveRecord гем

  2. добавить четкости инициализации ... (смотри ниже)

  3. Я теперь получаю ошибку установки грабли мои данные. это , похоже, имеет проблему с проверкой Contact (связанная с этим модель , которая создается сначала). Независимо от состояния, контакт всегда создается первым. Это было прекрасно, прежде чем менять драгоценный камень.

любые идеи? Я думаю, что я включил весь соответствующий код.

гем-файл:

ruby "2.2.2" 
gem "rails", "4.2.1" 
gem "pg", "0.17.1" # postgresql database 
gem "state_machines-activerecord" 

гем-блокировка файла

state_machines (0.4.0) 
state_machines-activemodel (0.3.0) 
    activemodel (~> 4.1) 
    state_machines (>= 0.4.0) 
state_machines-activerecord (0.3.0) 
    activerecord (~> 4.1) 
    state_machines-activemodel (>= 0.3.0)` 

lead.rb (модель):

`class Lead < ActiveRecord::Base 
    belongs_to :created_by_user, class_name: "User", inverse_of: :leads_created 
    belongs_to :contact 
    belongs_to :user 
    accepts_nested_attributes_for :contact 
    validates :contact, presence: true 
state_machine :state, initial: :new_lead do 
    state :claimed 
    state :referred 
    state :broadcast 
    state :unclaimed` 

    `event :claim! do 
     transition all => :claimed 
    end 

    event :unclaim! do 
     transition claimed: :unclaimed 
    end 

    event :refer! do 
     transition new_lead: :referred 
    end 

    event :broadcast! do 
     transition all => :broadcast 
    end` 



`def initialize(*) 
    super() # NOTE: This *must* be called, otherwise states won't get 
    initialized 
    end` 

CONTROLLER

def lead_attributes 
    params.require(:lead).permit( :claimed, 
     :contact_id, 
     :status, 
     :state, 
     :user_id 

setup_acceptance.rake

def create_contact(options={}) 
    user    = User.find_by(last_name: "Smith") 
    contact_attributes = { created_by_user: user, user: user } 
    attributes   = contact_attributes.merge options 
    contact = Contact.create! attributes 
    contact.save! 
    contact 
end 
def create_lead(options={}) 
    user    = User.find_by(last_name: "Smith") 
    client_attributes = { user: user, created_by_user: user } 
    attributes  = client_attributes.merge options 
    Lead.create! attributes ****(LINE 1311 where error message occurs)**** 
end 

rake.setup

Lead.transaction do #(NOTE: THIS IS LINE 435) 
    create_lead( #(NOTE: THIS IS LINE 436) 
     user: User.find_by(last_name: "Smith"), 
     contact: Contact.find_by(last_name: "Lozar"), 
     status: 0, 
     state: "claimed" 
     } 
     ] 
    ) 

ошибка:

rake aborted! 
ActiveRecord::RecordInvalid: Validation failed: Contact Please enter a value 
/Users/workspace/ab/lib/tasks/setup_acceptance.rake:1311:in `create_lead' 
/Users/workspace/ab/lib/tasks/setup.rake:436:in `block (2 levels) in <top (required)> 
/Users/workspace/ab/lib/tasks/setup.rake:435:in `block in <top (required)>' 
Tasks: TOP => setup_sample_data 
(See full trace by running task with --trace) 

ответ

1

с Большое спасибо @avdi

Решение было изменить:

super() 

... который отбрасывает все аргументы инициализации

к:

super 

... который сохраняет их в неявном виде.