Я разобрался в одном, и, снова читая мой оригинальный пост, все это действительно сбивает с толку, потому что я не знал, как точно сказать, чего я пытался достичь. Я должен сказать, что причина, по которой я был сбит с толку, заключается в том, что форма, которую я хотел, не соответствовала какой-либо модели, просто счетчик ассоциаций, который в конечном итоге является базовой HTML-формой, если вы хотите создать группу новых объектов без их атрибутов. еще. Я сначала уточню, а потом покажу свое решение.
Уточнение:
У меня есть 2 таблицы:
- Подписка
- Default_Subscription (предварительно заполнено)
Subscription belongs_to Default_Subscriptions
Default_Subscription has_many Subscriptions
Пользователь подписывается на мой сайт. Этот процесс шаг за шагом: не все происходит на одной странице.
Все это происходит в subse_controller. Каждое действие соответствует шагу в процессе.
Одним из действий является default_subscription. Это действие перечисляет подписки Default_Subscription, которые может выбрать пользователь, за исключением того, что они не просто выбирают, они могут вводить сумму для каждого типа подписки Default_Subscription, которую они хотят.
Когда Default_Subscription перечислены на странице default_subscription, я хотел получить форму с вводом номера html рядом с каждой из этих Default_Subscription. Когда форма отправляется с помощью следующей кнопки, я понятия не имел, как собрать количества из каждого html-ввода и создать массив Subscription.new, где default_subscription_id каждой подписки соответствует соответствующей Default_Subscription.
Одно из возможных решений:
def default_subscriptions
@def_subscriptions = Default_Subscription.all
end
Допустим, страница, на которую я хочу перейти после того, как все количества введены на странице default_subscription, является review_subscription.
Вот что я сделал, чтобы создать правильную форму для перехода к следующему действию в контроллере:
<%= form_tag( {:controller => 'subscribe', :action => 'review_subscriptions'}, :method => 'post' ) do %>
<ol>
<% @def_subscriptions.each do |ds| %>
<li>
<%= ds.name + ' ' %>
<%= number_field_tag("subscription_counts[#{ds.id}]") %>
</li>
<% end %>
</ol>
<%= submit_tag('Next') %>
<% end %>
Хитрость в том, что эта строка передана метке number_field_tag. Помещая один набор квадратных скобок в конец строки для параметра метода field_tag, часть перед скобками - это имя хеша, а вещь в скобках - это ключ в хеше, а кнопка отправки вызывает соответствующее значение для каждого ключа должно быть значением поля. Довольно круто!
Параметры, переданные следующему действию, будут содержать хеш с именем subscription_counts, и итерация по этому хешу даст соответствующую новую сумму подписки для каждого default_subscription_id. Вот так:
def review_subscriptions
subscription_counts = params[:subscription_counts]
subscription_counts.each do |id, amount|
counter = Integer(amount)
until counter == 0
new_subscription = Subscription.new
new_subscription.default_subscription_id = Integer(id)
@subscriptions << new_subscription # @subscriptions is an instance variable
counter -= 1
end
end
end
Я просто хотел бы отметить, что чем больше я с ними работаю, тем больше я их люблю; Я люблю Rails, и я люблю Ruby. Они супер веселые и стильные. До цикла ... как это круто? Если у вас есть другие решения, теперь, когда мой вопрос более очевиден, пожалуйста, присоединяйтесь! Я знаю, что другие пытаются найти несколько изящных способов создания нескольких новых объектов в ассоциации один-ко-одному с помощью одного пост-вызова, подобного этому. Технически мои объекты еще не сохранены в базе данных, но сейчас это будет не сложно.
Основная рекомендация, которая помогла мне больше всего в достижении этого решения, была:
http://guides.rubyonrails.org/form_helpers.html
Если вы новичок в рельсах и запутались в формах, прочитайте это. Теперь я чувствую себя мастером. Разработчики Rails отлично умеют документировать вещи!