2012-02-24 51 views
1

我是rails新手,但不是编程或数据库。Rails窗体和关联 - 使用数量形式添加多个对象

我的问题在下面我的答案更好地评价。

对于该示例中简单起见,我有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来获取数字吗?即使这些数量与任何特定的数据库字段没有关联,我是否也会使用rails表单?任何建议或指引我以正确的方向自行解决这个问题都会很好。

此表单框不是任何模型的字段,它是关联计数。让我改述一下:表单框中的每个数量表示要创建的新订阅数量。每个订阅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 

A用户是苏订阅我的网站。这个过程是一步一步的:并非所有事情都发生在同一页面上。

这一切都发生在subscribe_controller中。每个操作对应于该过程中的一个步骤。

其中一个操作是default_subscriptions。此操作列出了用户可以选择的Default_Subscriptions,除了他们不只是选择,他们可以为他们想要的每种类型的Default_Subscription输入金额。

当Default_Subscriptions在default_subscriptions页面上列出时,我想要一个带有这些Default_Subscription每一个的html数字输入的表单。当通过下一个按钮提交表单时,我不知道如何从每个html输入中收集数量,并创建一个Subscription.new数组,每个Subscription的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 2012-02-24 01:59:40

+0

Rails假设你正在做的几乎每个方面都是面向对象的。鉴于它是MVC架构,对象(模型)几乎是在MVC接口之间传递数据的要求。在你的情况下,我会创建一个临时使用的模型和控制器(例如,将其称为UserEnteredSubscriptions)。该模型将用于通过form_for机制将用户输入的数据从视图中返回到控制器中。然后,您可以使用此临时使用模型中的数据来创建适当的DEFAULT_SUBSCRIPTION和NEW_SUBSCRIPTIONS。然后删除临时对象。 – 2012-02-24 02:42:07

+0

是的MVC通常是如此优雅,我不能真正找出一个优雅的方式来解决这个问题。这是一个好主意,谢谢你。任何其他想法? – Ben 2012-02-24 19:46:22

相关问题