我已经找到了一种方法,并再次阅读我的原始文章,整件事情非常混乱,因为我不知道如何正确地说出我想要完成的事情。我必须说很多我困惑的原因是因为我想要的表单与任何模型都不对应,只是一个关联计数,如果你想创建一堆没有属性的新对象,它最终是一个基本的html表单然而。我会先澄清然后展示我的解决方案。
澄清:
我有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开发人员非常善于记录事物!
感谢您的详细和有益的答案,因为它澄清了一些其他的事情。这个表单框不是任何模型的字段,它是关联的计数。让我改述一下:表单框中的每个数量表示要创建的新订阅数量。每个订阅BELONGS_TO 1个DEFAULT_SUBSCRIPTION。本质上,该数字表示与默认订阅相关的新订阅数量。这有帮助吗? – Ben 2012-02-24 01:59:40
Rails假设你正在做的几乎每个方面都是面向对象的。鉴于它是MVC架构,对象(模型)几乎是在MVC接口之间传递数据的要求。在你的情况下,我会创建一个临时使用的模型和控制器(例如,将其称为UserEnteredSubscriptions)。该模型将用于通过form_for机制将用户输入的数据从视图中返回到控制器中。然后,您可以使用此临时使用模型中的数据来创建适当的DEFAULT_SUBSCRIPTION和NEW_SUBSCRIPTIONS。然后删除临时对象。 – 2012-02-24 02:42:07
是的MVC通常是如此优雅,我不能真正找出一个优雅的方式来解决这个问题。这是一个好主意,谢谢你。任何其他想法? – Ben 2012-02-24 19:46:22