Ruby on Rails 3: ассоциация HABTM не обновляет таблицу соединений - PullRequest
2 голосов
/ 18 января 2012

Я новичок в Ruby on Rails и отчаянно пытаюсь заставить работать ассоциацию HABTM.У меня есть база данных клиентов, в которой каждый клиент может иметь много контактов.Из представления «показать» клиентов мне нужна ссылка для добавления нового контакта к выбранному клиенту.

Пока у меня есть следующие данные:

models / customer.rb:

class Customer < ActiveRecord::Base
  has_and_belongs_to_many :contacts
  accepts_nested_attributes_for :contacts, :allow_destroy => true
end

models / contact.rb:

class Contact < ActiveRecord::Base
  has_and_belongs_to_many :customers
end

views / Customers / show.html.erb:

<%= link_to 'Add new contact', new_customer_contact_path(@customer) %>

У меня также есть три таблицы:

customers (id, name)
contacts (id, name)
contacts_customers (contact_id, customer_id)  <- the join-table

Теперь, когда я нажимаю на ссылку «добавить новый контакт», я попадаю на страницу «новый клиент», она даже правильно назначает customer_id, но когда я нажимаю «сохранить» после заполненияв контактной информации контакт создается, но объединяемая таблица (contacts_customers) не обновляется.В результате вновь созданный контакт не «подключен» к клиенту.

Я уже просматривал сеть в течение двух часов по этому вопросу и не могу с собой поделать.Я был бы более чем счастлив, если бы кто-то мог указать мне правильное направление!

Спасибо!

[Редактировать: Обновленные данные] Вот какие параметры передаются, как только я нажимаю «новый»contact "link on my" show.html.erb "view

Started GET "/customers/260/contacts/new" for 127.0.0.1 at 2012-01-18 08:21:28
  Processing by ContactsController#new as HTML
  Parameters: {"customer_id"=>"260"}
  Customer Load (0.0ms) SELECT 'customers'.* FROM 'customers' WHERE 'customers'.'id' = 260 LIMIT 1
  Rendered contacts/_form.html.erb (9.0ms)
  Rendered contacts/new.html within layouts/application (13.0ms)
  Completed 200 OK in 343 ms (Views: 26.0ms  | ActiveRecord: 299.0ms)

Как видите, customer_id (в моем примере это 260) должен быть передан новому контроллеру контактов.Однако, когда я нажимаю «сохранить», который запускает POST-запрос для фактического создания записей базы данных, customer_id теряется и обновляется только таблица контактов:

Started POST "/contacts" for 127.0.0.1 at 2012-01-18 08:28:00 +0100
  Processing by ContactsController#create as HTML
  Parameters: {"utf8"=>"Ô£ô", "authenticity_token"=>"jWMlruMezFGOy1j7vTbE9OcL8VareGUXS1AprBpNhGA=", "contact"=>{"anrede"=>"", "name"=>"Test", "position"=>"", "telefon"=>"", "mobil"=>"", "fax"=>"", "email"=>"", "sonstiges"=>""}, "commit"=>"Create Contact"}
  BEGIN SQL (0.0ms)
  INSERT INTO `contacts` (`anrede`, `email`, `fax`, `mobil`, `name`, `position`, `sonstiges`, `telefon`) VALUES ('', '', '', '', 'Test', '', '', '') (113.0ms)
  COMMIT
  Redirected to http://localhost:3000/contacts/626
  Completed 302 Found in 174ms

Я не уверен, что онлюбая помощь, но на всякий случай.Мои маршруты настроены так:

resources :contacts
resources :customers do
  resources :contacts
end

1 Ответ

2 голосов
/ 18 января 2012

Одна вещь, которую нужно проверить, - это если вы определили какие-либо атрибуты с помощью макроса attr_accessible.Для получения дополнительной информации смотрите ссылку ниже.

http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html#label-Saving.

Я бы предложил проверить хэш параметров в консоли.Вы можете использовать оператор logger для просмотра хэша params и попытаться изменить хеш, чтобы он заработал.

Было бы полезно, если вы опубликуете хэш params, чтобы увидеть, чего вам не хватает

...