2012-02-24 2 views
1

Я новичок в рельсах, но не для программирования или баз данных.Rails Forms and Associations - Добавление нескольких объектов с количественной формой

ЛУЧШЕЕ ФРАЗИРОВАНИЕ МОЕГО ВОПРОСА В МОЕМ ОТВЕТЕ НИЖЕ.

Для простоты в этом примере, у меня есть 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 и 1.8.7 рубин

Спасибо

ответ

0

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

Пояснение:

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

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

0

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

Используйте функцию 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 

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

Удачи.

+0

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

+0

Rails предполагает объектно-ориентированный подход практически к каждому аспекту того, что вы делаете. Учитывая, что это MVC-архитектура, объекты (модели) в значительной степени являются обязательными для передачи данных между интерфейсами MVC. В вашем случае я бы создал модель временного использования и контроллер (например, называйте это UserEnteredSubscriptions). Эта модель будет использоваться для получения введенных пользователем данных из представления обратно в контроллер через механизм form_for. Затем вы можете использовать данные в этой модели временного использования для создания соответствующих DEFAULT_SUBSCRIPTION и NEW_SUBSCRIPTIONS. Затем удалите временный объект. –

+0

Да, MVC, как правило, настолько изящна, и я не мог понять, как это можно было изящно решить. Это хорошая идея, спасибо за это. Любые другие идеи? – Ben

Смежные вопросы