Rails 3 и fields_for с объектом activemodel (без таблиц) - PullRequest
5 голосов
/ 20 февраля 2012

У меня есть модель без таблиц, для которой я пытаюсь сгенерировать некоторые поля формы.

Форма выглядит следующим образом:

= form_for :users, url: users_path do |f|
  - books.each do |book|
    = f.fields_for :books, book do |bf|
      = bf.hidden_field :title, value: book.title
  = f.submit "Send"

То, что я ожидаю, будет сгенерировано длякаждое поле выглядит примерно так:

<input name="users[books][][title]" type="hidden" value="Some Book Title">
<input name="users[books][][title]" type="hidden" value="Some Book Title">
<input name="users[books][][title]" type="hidden" value="Some Book Title">

Однако на самом деле я получаю

<input name="users[books][title]" type="hidden" value="Some Book Title">
<input name="users[books][title]" type="hidden" value="Some Book Title">
<input name="users[books][title]" type="hidden" value="Some Book Title">

. Это означает, что при отправке формы в качестве поля доступно только последнее поле ввода.предыдущие два были перезаписаны из-за того, что они ссылались на одну и ту же вещь.

Это работает нормально, когда модель имеет активный бэкэнд записи, но не когда она без таблиц.

Есть предложения?

Ответы [ 4 ]

7 голосов
/ 20 февраля 2012

Я думаю, вам нужно добавить это к вашей модели пользователя

def books_attributes= attributes
  # do something with attributes
  # probably:
  # self.books = attributes.map{|k,v|Book.new(v)}
end

, а также определить метод persisted? для экземпляра Book.Сделайте это просто, чтобы вернуть false.

И добавить f для ваших fields_for в поле зрения:

= f.fields_for :books, book do |bf|

Надеюсь, это сработает.

0 голосов
/ 13 апреля 2013

Попробуйте это:

f.fields_for 'books[]', book do |bf|
0 голосов
/ 09 мая 2012

Сейчас это довольно сложно сделать с Rails 3.x.Это изменится с Rails 4 с появлением ActiveModel::Model, который даст все базовые методы для вашей модели, которые будут ActionPack совместимыми.

Однако, пока Rails 4 не выпущен, хороший стандарт для вашей модели ActionPack совместим сам модуль ActionModel::Model.Он «должен» работать с текущими стабильными Rails. Проверьте это

Как вы решите реализовать это - ваше решение, но я бы, вероятно, просто скачал файл и выбросил его в каталог lib моего приложения.Таким образом, я мог бы просто включить его, используя

class Book
  include ActiveModel::Model
end

Easy Rails Form совместимость для пользовательских моделей.

0 голосов
/ 08 мая 2012

Welldan97 поднимает очень важный момент.Вам нужен настойчивый?метод.Ранее я получал неопределенный метод для названия модели.Проверьте мою суть.Работает, но никак не идеально.https://gist.github.com/2638002

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...