Ассоциация Rails терпит неудачу на Heroku, но работает на локальной коробке? - PullRequest
0 голосов
/ 07 апреля 2011

Почему я получаю NoMethodError в моем приложении Heroku, когда тот же код работает безупречно на моей локальной установке?

Ошибка вызывается этим кодом:

@customer = Customer.find(1)
@customer.responses.create(:offer_id => '1', :digit => '2')

Этот код работает должным образом на моем локальном сервере и в моей локальной консоли Rails.

Однако на Heroku приведенный выше код вызывает NoMethodError:

NoMethodError (undefined method `responses' for #<Customer:0x7f7bcbee3808>):

Ответ модель привязана к модели Customer с помощью own_to: customer

Кроме того, я могу войти в консоль Heroku и запустить ее без проблем:

Response.create(:offer_id => '1', :customer_id => '1', :digit => '2')

Так что, если вышеприведенное работает и обе версии работают нормально на моем локальном компьютере, то почему Heroku не может выполнить ассоциацию?

-

Запуск Rails 3.0.6 ипротестировано на Heroku Ruby 1.8.7 и Ruby 1.9.2

Базы данных идентичны на Heroku и на моем локальном компьютере.

Ответы [ 3 ]

2 голосов
/ 07 апреля 2011

Обычно, когда что-то подобное не работает, это означает, что вы пропустили has_many ассоциацию. Вам нужно определить обе стороны belongs_to и has_many ассоциации, если вы хотите получить доступ к ним обеим.

Судя по звукам, если он работает на вашем локальном компьютере, но не на Heroku, то это происходит потому, что вы не передали изменения серверу Heroku и не перезапустили консоль там. Пожалуйста, убедитесь, что вы нажали изменения и попробуйте снова.

1 голос
/ 07 апреля 2011

Марко, я немного подумал об этом, и у меня есть несколько догадок, чтобы вы попробовали.Прежде чем сделать что-либо из этого, перезапустите приложение.Иногда это делает чудеса.

heroku restart

Хорошо, теперь попробуйте в консоли просто

@customer.responses

Что это возвращает?Я предполагаю, что это должно быть [].Может быть, сделать некоторые проверки и т. Д. Это может дать нам понимание здесь.Если вы создаете и связываете ответ вручную, вы можете заставить его отображаться?

Во-вторых, ошибка, связанная с отсутствием метода, связана с responses, а не с create, поэтому, что бы вы ни вводили после этого, вероятно, нетважно, НО, ваши offer_id и digit поля являются целыми числами?Если это так, попробуйте создать их, используя целые числа, а не строки.PostgreSQL настолько хрупок по сравнению с MySQL или SQLite, у меня было множество проблем, связанных с моей незнакомой работой с Postgre до разработки на Heroku.

@customer.responses.create(:offer_id=>1,:digit=>3)

Это, вероятно, не имеет значения, но оно того стоитпроверка.

Другая вещь, которую нужно проверить, - это все ваши обратные вызовы и проверки и т.д.Это может показаться не связанным, но у меня раньше были проблемы, когда все происходило очень странно из-за, казалось бы, крошечных тихих сбоев в обратном вызове, который я пропустил.Я уверен, что вы тестируете по ходу дела, но если у вас есть небольшое тестовое покрытие где-нибудь на этой модели, вы могли бы также использовать эту охоту за ошибками как шанс усилить ее:)

Симпатии наошибка, я не знаю, поможет ли это, но удачи!Пожалуйста, напишите, если сотрудники Heroku обнаружат проблему, мне было бы очень интересно узнать из нее!

0 голосов
/ 07 апреля 2011

Я думаю, что ваша проблема в том, как вы создаете ответ:

@customer.responses.create(:offer_id => '1', :digit => '2')

Возможно, вы захотите попробовать это вместо этого.

Response.create(:offer_id => '1', :digit => '2', :customer_id => 1)
...