Я разобрался в одном направлении и снова прочитал свое оригинальное сообщение, все это действительно сбивает с толку, потому что я не знал, как точно сказать, чего я пытаюсь выполнить. Я должен сказать, что многие из причин, по которым я был смущен, - это то, что форма, которую я хотел, не соответствовала какой-либо модели, просто счет ассоциации, которая в конечном счете является базовой формой html, если вы хотите создать кучу новых объектов без наличия их атрибутов все же. Сначала я уточню, покажу свое решение.
Пояснение:
У меня 2 таблицы:
- Подписка
- Default_Subscription (предварительно заполненному)
Subscription belongs_to Default_Subscriptions
Default_Subscription has_many Subscriptions
пользователь су bscribing на мой сайт. Этот процесс является шаг за шагом: не все происходит на одной странице.
Все это происходит в subscribe_controller. Каждое действие соответствует этапу процесса.
Одним из действий является default_subscriptions. В этом действии перечислены слова Default_Subscriptions, которые пользователь может выбрать, за исключением того, что они не просто выбирают, они могут вводить сумму для каждого типа нужной по умолчанию подписки.
Когда список Default_Subscriptions указан на странице default_subscriptions, мне нужна форма с вводом номера html рядом с каждой из этих Default_Subscription. Когда форма отправляется с помощью следующей кнопки, я понятия не имел, как собирать количества из каждого входа в html и создавать массив Subscription.new с каждой подписью default_subscription_id, соответствующей соответствующей Default_Subscription.
Одно из возможных решений:
def default_subscriptions
@def_subscriptions = Default_Subscription.all
end
Допустим, страница Я хочу, чтобы перейти к после того, как все величины вводятся на странице default_subscriptions является review_subscriptions.
Вот что я сделал, чтобы создать правильную форму, чтобы перейти к следующему действию в контроллере:
<%= 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 действительно умеют документировать вещи!
Благодарим вас за подробный и полезный ответ, потому что он разъяснил несколько других вещей. Это поле формы НЕ ПОЛЕ ДЛЯ ЛЮБОЙ МОДЕЛИ, это счет для ассоциации. Позвольте мне перефразировать: каждое количество в коробках формы представляет количество новых подписей, которые нужно создать. Каждая из этих подписей BELONGS_TO 1 DEFAULT_SUBSCRIPTION. По сути, число представляет собой количество новых подписей, связанных с этим подсекретированием по умолчанию. Помогает ли это? – Ben
Rails предполагает объектно-ориентированный подход практически к каждому аспекту того, что вы делаете. Учитывая, что это MVC-архитектура, объекты (модели) в значительной степени являются обязательными для передачи данных между интерфейсами MVC. В вашем случае я бы создал модель временного использования и контроллер (например, называйте это UserEnteredSubscriptions). Эта модель будет использоваться для получения введенных пользователем данных из представления обратно в контроллер через механизм form_for. Затем вы можете использовать данные в этой модели временного использования для создания соответствующих DEFAULT_SUBSCRIPTION и NEW_SUBSCRIPTIONS. Затем удалите временный объект. –
Да, MVC, как правило, настолько изящна, и я не мог понять, как это можно было изящно решить. Это хорошая идея, спасибо за это. Любые другие идеи? – Ben