Rails Forms and Associations - Добавление нескольких объектов с количественной формой - PullRequest
1 голос
/ 24 февраля 2012

Я новичок в рельсах, но не в программировании или базах данных.

ЛУЧШЕ ФРАЗИРОВАНИЕ МОЕГО ВОПРОСА В МОЙ ОТВЕТ ниже.

Для простоты в этом примере у меня есть 3 модели: пользователь Подписка Default_Subscription

User has_many Subscriptions
Subscription belongs_to User

Default_Subscription has_many Subscriptions
Subscription belongs_to Default_Subscription

Default_Subscription - это предварительно заполненная таблица с определенными типами подписок.

В процессе подписки подписки по умолчанию перечислены в одной точке, и там это поле количества рядом с каждым.

Пользователь вводит количества для каждой подписки и нажимает кнопку "Отправить", чтобы продолжить.

Мой вопрос: Как можно создать новую подписку для каждого количества в числовой форме?

Итак, у вас есть список примерно такой:

<ol>
   <%= each subscription with quantity box %>
</ol>

<%= button_to %>

Когда пользователь нажимает кнопку, как вы складываете количество из каждого ящика и добавляете новую подписку для каждого? Должен ли я использовать JavaScript, чтобы получить числа? Использую ли я каким-либо образом формы рельсов, даже если эти величины не связаны ни с каким конкретным полем базы данных? Любые рекомендации или указание мне в правильном направлении, чтобы понять это самостоятельно, было бы здорово.

Это поле формы НЕ ПОЛЕ ДЛЯ ЛЮБОЙ МОДЕЛИ, это количество для ассоциации. Позвольте мне перефразировать: каждое количество в полях формы представляет количество НОВЫХ подписок, которые будут созданы. Каждая из этих подписок BELONGS_TO 1 DEFAULT_SUBSCRIPTION. По сути, число представляет количество новых подписок, связанных с подпиской по умолчанию.

Я использую рельсы 3.2.1 и ruby ​​1.8.7

Спасибо

Ответы [ 2 ]

0 голосов
/ 28 февраля 2012

Я разобрался в одном, и, снова читая мой оригинальный пост, все это действительно сбивает с толку, потому что я не знал, как точно сказать, чего я пытался достичь. Я должен сказать, что причина, по которой я был сбит с толку, заключается в том, что форма, которую я хотел, не соответствовала какой-либо модели, просто счетчик ассоциаций, который в конечном итоге является базовой HTML-формой, если вы хотите создать группу новых объектов без их атрибутов. еще. Я сначала уточню, а потом покажу свое решение.

Уточнение:

У меня есть 2 таблицы:

  1. Подписка
  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 отлично умеют документировать вещи!

0 голосов
/ 24 февраля 2012

Не уверен, что полностью понимаю ваше описание, но я сделаю снимок.

Используйте функцию 'form_for' для создания вашей формы на основе экземпляра @default_subscription (установленного в "новом").действие в вашем контроллере).Если в @default_subscription есть значения по умолчанию, они будут отображаться в полях, и пользователь может изменять их по своему усмотрению.(предполагается, что ваша модель DefaultSubscription имеет три атрибута: sub1, sub2 и sub3.)

<%= form_for @default_subscription do |f|
  <%= f.label :sub1 %><br />
  <%= f.number_field :sub1 %>

  <%= f.label :sub2 %><br />
  <%= f.number_field :sub2 %>

  <%= f.label :sub3 %><br />
  <%= f.number_field :sub3 %>

<% end %>

Когда пользователь нажимает кнопку отправки, содержимое формы, с которой мы собрали хеш и передал в контроллер вашего устройства "обновить "действие через params [].Вы можете извлечь хеш подписки следующим образом:

 user_subscription = params[:default_subscription]

На данный момент у вас есть все числа, которые пользователь ввел в поля хэша user_subscription.Теперь вы можете проанализировать хеш, чтобы извлечь числа, выполнить математические расчеты, а затем создать соответствующие подписки для ввода пользователя.(одно примечание: числа могут быть строками, и вам может потребоваться преобразовать их обратно в целые числа, как я показал ниже.)

Например, для суммирования всех значений подписки и сохранения этой суммы в подписке пользователя.:

total = 0;
user_subscription.each do |key, value|
  total += value.to_i
end

new_sub = current_user.subscription.new
new_sub.total = total
new_but.save

Как я уже сказал, я не совсем ясно понимаю ваше описание, так что это может быть не совсем так, но надеюсь, оно близко к тому, что вы искали.

Удачи.

...