2

我正在通过 ajax 提交数据以插入数据库。

由于视图和表单的复杂性,我发送了一些冗余信息(两种形式合二为一)。

例如我发送的数据是

partner_id:940
partner_ref: 1
product_1_id:50
product_1_quantity:1

然后在我的控制器中,我提交除partner_idand之外的所有内容partner_ref,为此我正在计算POST数组的大小,减去 2 以说明我不想存储的 2 个参数,然后将其除以 2 以获得实际数量产品被存储,因此结果应该是 1,但表中存储了 2 个条目。

# get number of parameters passed and subtract 2 for partner_id and partner_ref
# divide count by two to get actual number of line items
line_items = ((params.size - 2) / 2)

count = 1
for i in count..line_items  
  item_id  = params["product_#{count}_id"]
  quantity = params["product_#{count}_quantity"]

  # had to add this conditional statement to prevent NULL entries in the database
  if !item_id.nil? and !quantity.nil?
    line_item = QuoteItem.create(:price_list_item_id => item_id, :quantity => quantity)
  end
    count = count + 1
end

render :text => line_items # => 2 when it should be 1

这一定是愚蠢的,但看不出有什么不对。

4

2 回答 2

2

默认情况下,rails 日志的参数不是整个params哈希。例如,在我的应用程序中,如果我进行搜索,我会看到默认情况下在 rails 中记录以下参数:

Parameters: {"utf8"=>"✓", "term"=>"searchterm"}

但是,如果我记录调用哈希的结果,我会得到inspectparams

{"utf8"=>"✓", "term"=>"searchterm", "action"=>"search", "controller"=>"home"}

这是因为 rails 使用params散列将控制器和操作名称存储在params散列中。正如您所评论的,在某些(POST)表单上,您还将添加 CSRF 参数。

你最好看看 rails 如何将参数解释为数组和散列。正如 Yoshiji 先生所评论的那样,如果您使用products[][id]rails 会将其转换为哈希数组。您还可以对位置使用显式数组引用。

因此,使用文本字段标签(指定值以更清楚地说明):

text_field_tag("products[][id]", "1")
text_field_tag("products[][quantity]", "11")
text_field_tag("products[][id]", "2")
text_field_tag("products[][quantity]", "22")

您的参数将包含这样的产品值:

"products"=>[{"id"=>"1", "quantity"=>"11"}, {"id"=>"2", "quantity"=>"22"}]

这意味着您不必计算任何东西,您可以迭代产品并处理它们:

params["products"].each do |product_hash|
  product_hash["id"]       # The id
  product_hash["quantity"] # The quantity
end
于 2013-09-04T14:53:06.270 回答
0

您应该检查传入的参数。您只考虑了两个合作伙伴参数,但在实际场景中可能会有更多参数,如控制器、操作或身份验证令牌等。

于 2013-09-04T14:10:45.977 回答