2015-11-03 110 views
1

我想從state_machine更改爲state_machines。當我開始這樣做時,我遇到了國家不再從初始狀態改變。升級到state_machines時驗證問題gem

回顧了一些計算器和其他指南: -

因此改變我已經做:

  1. 使用狀態機,ActiveRecord的寶石

  2. 加DEF初始化... (見下文)

  3. 我現在對我的數據得到一個耙子設置錯誤。它 似乎與驗證聯繫人(首先創建一個相關的 模型)有問題。無論狀態如何,聯繫人總是首先創建 。這在改變寶石之前運行良好。

有什麼想法嗎?我想我已經包含了所有相關的代碼。

偕文件:

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 

...含蓄地保留他們。