2014-02-14 116 views
0

我必須在這裏丟失一些非常明顯的東西,但目前我不能看到樹木,這感覺很像一個noob問題! :)訪問控制器塊中的模型變量

我有一個模型HousePrice,有兩個屬性,郵政編碼和價格。

郵編目前是一個字符串,包括一些地址在開頭,然後是一個或多個郵政編碼。例如..

postcodes = "High Street, Tetsworth, Thame, OX9 OX9 7AB OX9 7AD OX9 7AE OX9 7AS OX9 7AT  OX9 7BS OX9 7BZ" 

我有一個紅寶石腳本,剝離我不想要的文本,並返回僅作爲數組的郵編。它可能並不是最好的,但是它完成了這項工作!

我在我的HousePrices控制器中有一個自定義def,它從索引頁上的鏈接調用。但是,我不斷收到

undefined method `slice!' for nil:NilClass 

我很困惑!

以下是我與嘗試它...

def second_distance_run 

HousePrice.all.each do |pca| 
    @postc = [] 
    @array = pca.split(',').to_a 
    @srt = @array[3] 
    @srt.slice!(0,5) 
    aa = @srt.split(' ').to_a 
    aa.each_slice(2) do |elem| 
     @postc << (elem[0].to_s) + (elem[1].to_s) 
    end 
end 

在CONSOL它的工作原理,如果你給它的字符串,但如果它得到它從數據庫中。我知道我錯過了一些愚蠢的東西,但我很掙扎!

在此先感謝!

+1

好吧,'logger.info pca'會告訴你你實際上有什麼。很可能你會得到一個空字符串或一個字符串,分割後的部分少於4個。 –

+1

btw:分割後的'.to_a'是無用的,因爲'split'無論如何返回一個數組。 –

+2

你是怎麼給'pca'打'split'的?它應該是'HousePrice'模型的一個實例,而不是一個字符串 - 您是否在模型上定義了拆分(或者將它委託給某個位置)?最有可能你想'pca.postcodes.split ...'而不是 – BroiSatse

回答

2

讓我們仔細看看代碼。錯誤發生在這裏:

@array = pca.split(',').to_a 
@srt = @array[3] 
@srt.slice!(0,5) 

看起來你@srt變量nil即不設置任何東西。我敢打賭,這是因爲@array變量沒有第四個元素(從0開始,@array[3]返回第四個元素)。

你需要做的是使用某種調試器並直接掛鉤進程。這裏有一個鏈接指導關於Debugging Rails Applications

祝你好運!

+0

謝謝!要深入調試!但是我沒有得到的是,如果我通過ID或者.last調用HousePrice,但是當我通過該塊運行時,它不起作用!所以我的錯誤必須是我如何處理這個區塊? –

+0

也許。不能肯定地說。您需要仔細閱讀代碼,逐步檢查流程的每個階段發生了什麼。相信我,這是軟件工程師最有價值的技能之一。 – marvelousNinja

+0

+1爲我介紹2良好的做法!但它通過步驟2進入Ruby源代碼,所以我仍然失去了!但會繼續嘗試! :) –

0

您是否已經找到解決問題的方法?

關於你的問題的標題似乎是一切正確的。

正如BroiSatse和marvelousNinja指出的那樣,嘗試在整個算法中調試問題。

我試圖重新在手,在我的情況下,我們正在談論的作品片段的問題,如果BroiSatses評論

你可能要pca.postcodes.split ...

和marvelousNinjas評論

我打賭那是因爲@array變量的不具有第四 元件(從0開始,@array [3]返回第四元件)

被照顧。

此外,這是一個練習最佳實踐,tdd和重構的好例子。 我用rspec和一個PORO(普通的老紅寶石對象)只是爲了專注於發佈的算法。

3 class HousePrice# < ActiveRecord::Base 
    4 
    5 attr_accessor :postc, :postcodes 
    6 
    7 def initialize 
    8  self.postc  = [] 
    9  self.postcodes = "High Street, Tetsworth, Thame, OX9 OX9 7AB OX9 7AD OX9 7AE OX9 7AS OX9 7AT  OX9 7BS OX9 7BZ" 
10 end 
11 
12 def self.all 
13  [ HousePrice.new ] 
14 end 
15 
16 def second_distance_run 
17  HousePrice.all.each do |pca| 
18  array = pca.postcodes.split(',') 
19  srt = array[3] 
20  srt.slice!(0,5) 
21  aa = srt.split(' ') 
22  aa.each_slice(2) do |elem| 
23   postc << (elem[0]) + (elem[1]) 
24  end 
25  end 
26 end 
27 
28 end 
29 
30 describe HousePrice do 
31 
32 describe '#postcodes' do 
33  it 'returns a string that includes several postcodes' do 
34  house_price = HousePrice.new 
35  expect(house_price.postcodes).not_to be_nil 
36  end 
37 end 
38 
39 describe '#second_distance_run' do 
40  it 'sets the postcodes' do 
41  house_price = HousePrice.new 
42  house_price.second_distance_run 
43  expect(house_price.postc).to eq ["OX97AB", "OX97AD", "OX97AE", "OX97AS", "OX97AT", "OX97BS", "OX97BZ"] 
44  end 
45 end 
46 end 
+0

謝謝輸入!調試實際上救了我!這是事物的組合,但是使用pluck幫助從數據庫中獲取數組。這個錯誤是由於我的數據不全是相同的,每200行它有「地址/郵政編碼」,導致了無錯誤!感謝所有人的幫助,這是拯救了我的測試和調試,並且毫無疑問將會在未來多次拯救我! :)我知道這是Refactor的一個很好的例子,我現在已經準備好了我的敏捷書籍,現在我已經寫好了我的測試! –

+0

不客氣。這也很有趣,幫助和調試也是=)。 – krabbi