2014-02-14 6 views
0

Должно быть, мне не хватает чего-то действительно очевидного, но я не вижу дерева для деревьев в данный момент, и это очень похоже на вопрос о нобе! :)Доступ к переменной модели в блоке в контроллере

У меня есть модель HousePrice с двумя атрибутами, почтовыми индексами и ценой.

Почтовые индексы в настоящее время представляют собой строку, содержащую некоторый адрес в начале, а затем 1 или более почтовых индексов. Например ..

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

У меня есть сценарий рубиновый, что вырезает текст я не хочу, и возвращает только почтовые индексы, как Array. Это может быть не самое лучшее, но это делает работу!

У меня есть пользовательский def в моем контроллере HousePrices, и он вызывается из ссылки на индексной странице. Тем не менее, я продолжаю получать

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' расскажет вам, что вы на самом деле имеете. Скорее всего, вы получаете пустую строку или строку с менее чем четырьмя частями после раскола. –

+1

btw: '.to_a' после разделения бесполезно, так как' split' возвращает массив в любом случае. –

+2

Как вы называете 'split' на' pca'? Это должен быть экземпляр модели «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

Спасибо! Собираюсь погрузиться в отладку! Но я не понимаю, что это работает, если я вызываю HousePrice по ID или .last, но не тогда, когда я запускаю его через блок! Значит, моя ошибка заключается в том, как я правильно обрабатываю блок? –

+0

Возможно. Не могу сказать точно. Вам нужно пройти через код, шаг за шагом и проверить, что происходит на каждом этапе процесса. Поверьте мне, это одно из самых ценных навыков для разработчиков программного обеспечения. – marvelousNinja

+0

+1 для представления меня 2 хорошей практики! Но он переходит в исходный код Ruby на шаг 2, поэтому я все еще потерял! Но буду стараться! :) –

0

У вас есть решение проблемы.

Что касается названия вашего вопроса, похоже, все правильно.

Как указал BroiSatse и изумительныйNinja, попытайтесь отладить проблему во всем алгоритме.

я попытался воссоздать эту проблему под рукой, и в моем случае сниппета мы говорим о работах, если BroiSatses комментарий

Скорее всего, вы хотите pca.postcodes.split ...

и marvelousNinjas комментарий

я бы поспорить, что это из-за @array переменной не имеет четвертый элемент (начиная с 0, @array [3] возвращает четвертый элемент)

позаботился.

Также это отличный пример для практики лучших практик, tdd и рефакторинга. Я использовал rspec и PORO (простой старый объект ruby), чтобы сосредоточиться на опубликованном алгоритме.

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

Thankyou для ввода! Отладка спасла меня на самом деле! Это была комбинация вещей, но использование pluck помогло для массива из базы данных. Ошибка была вызвана тем, что не все мои данные были одинаковыми, каждые 200 строк имели «адрес/почтовый индекс», что приводило к ошибке Nil! Спасибо всем за помощь, и это было тестирование и отладка, которые спасли меня, и, несомненно, снова спасут меня много раз в будущем! :) Я знаю, что это отличный пример для Refactor, на самом деле у меня есть своя книга в руке, чтобы пойти на нее сейчас, я написал свои тесты! –

+0

Добро пожаловать. Это было весело помогать и отлаживать, тоже =). – krabbi

Смежные вопросы