2011-12-29 89 views
0

這裏是一個comm_logs控制器 '創建'與控制器Rspec的錯誤 '創建'

def create 
    if has_create_right? 
     @customer = Customer.find(params[:customer_id]) 
     @comm_log = @customer.comm_log.new(params[:comm_log], :as => :roles_new) 
     @comm_log.input_by_id = session[:user_id] 
     if @comm_log.save 
     #send out email 
     redirect_to URI.escape("/view_handler?index=0&msg=Log saved!") 
     else 
     flash.now[:error] = "can't save log!" 
     render 'new' 
     end  
    else 
     redirect_to URI.escape("/view_handler?index=0&msg=insufficient rights!")  
    end 
    end 

的rspec的代碼是:

describe "'create'" do 
    it "should be successful for sales member" do 
     session[:sales] = true 
     session[:user_id] = 1 
     session[:member] = true 
     customer = Factory(:customer) 
     log = Factory(:comm_log, :customer_id => customer.id)  
     get 'create', :customer_id => customer.id, :comm_log => log 
     response.should redirect_to URI.escape("/view_handler?index=0&msg=Log saved!") 
    end 
    end 

這裏是RSpec的錯誤:

1) CommLogsController 'create' should be successful for sales member 
    Failure/Error: get 'create', :customer_id => customer.id, :comm_log => log 
    NoMethodError: 
     undefined method `stringify_keys' for "1":String 
    # c:in `build' 
    # ./app/controllers/comm_logs_controller.rb:30:in `create' 
    # ./spec/controllers/comm_logs_controller_spec.rb:79:in `block (3 levels) in <top (required)>' 

完全相同的代碼(控制器和rspec)適用於另一個類似的控制器。

有關這個問題的任何想法?謝謝。

回答

2

此行是罪魁禍首:

      get 'create', :customer_id => customer.id, :comm_log => log 

你試圖東西實際ActiveRecord的實例到params哈希表。 Rails知道參數不能是這樣的對象,所以它會發送id。然後嘗試使用該ID,就好像它是一個散列,這顯然不起作用。

而是傳遞實際提交的內容:創建對象的值的散列值。你可能會發現工廠女孩的attributes_for方法有用。

順便說一句,能夠'獲得'創建動作很奇怪。

+0

在rspec中添加attributes_for解決了問題。多麼愚蠢的錯誤。謝謝! – user938363 2011-12-29 15:41:09

1

create方法中,new action期望獲得屬性散列並將它的字符串化爲列名的鍵。

更換
@comm_log = @customer.comm_log.new(params[:comm_log], :as => :roles_new)

@comm_log = @customer.comm_log.new(:comm_log => params[:comm_log], :as => :roles_new) 或它適合用於各個型號的列名。

+0

在控制器中添加harsh:comm_log => parmas [:comm_log]消除了錯誤(NoMethodError ...)。但是rspec代碼沒有通過。它返回200而不是redirect_到一個頁面。謝謝。 – user938363 2011-12-29 15:43:04