Ваша проблема выглядит так, как будто ваша первая инструкция в методе обновления - вы создаете новую запись винного бара вместо того, чтобы загружать существующую запись и обновлять ее.Вот почему, когда вы просматриваете запись, ничего не показывает отношения.Rails достаточно достаточно умен, чтобы не создавать и не создавать каждую запись в списке, поэтому не беспокойтесь об этом.
Если вы используете стандартную настройку rails для своих форм:
<% form_for @wine_bar do |f| %>
Затем вы можете назвать свое обновление следующим образом:
class WineBarController
def update
@winebar = WineBar.find(params[:id])
render (@winebar.update_attributes(params[:wine_bar]) ? :update_success : :update_failure)
end
end
Вам не нужно явно обновлять свою запись с помощью params[:wine_bar][:wine_ids]
, потому что, когда вы обновили ее с помощью params[:wine_bar]
,wine_ids были включены как часть этого.Надеюсь, это поможет!
ОБНОВЛЕНИЕ: Вы упомянули, что это не работает из-за настройки форм, но вы можете легко это исправить.В вашей форме вы захотите переименовать поле ввода с wine_bar[wine_ids]
на wine_bar[wine_ids_string]
.Затем вам просто нужно создать методы доступа в вашей модели, например:
class WineBar < ActiveRecord::Base
def wine_ids_string
wines.map(&:id).join(',')
end
def wine_ids_string= id_string
self.wine_ids = id_string.split(/,/)
end
end
Первый метод, описанный выше, - это «getter» - он берет список связанных идентификаторов Wine и конвертирует их в строку, которуюФорма может использовать.Следующим методом является «setter», и он принимает строку идентификаторов, разделенных запятыми, и разбивает ее на массив, который принимает wine_ids=
.
Вас также может заинтересовать моя статья Динамические элементы форм в Rails , в которых показано, как рельсы формируют входные данные, не ограничиваются атрибутами в записи базы данных.Можно использовать любую пару методов доступа.