Rails:在参数中展平数组

时间:2010-08-08 22:49:05

标签: ruby-on-rails arrays controller

我正在尝试为我的表单压扁一个数组。

def update
  @tour = Tour.find(params[:id])
  params[:tour][:hotel_ids][0] = params[:tour][:hotel_ids][0].split(',')
...

这导致:

"hotel_ids"=>[["1","2"]]

当然我希望它是

"hotel_ids"=>["1","2"]

我的表格:

<%= text_field_tag 'tour[hotel_ids][]', nil %>

希望任何人都可以提供帮助。

修改


我已经以某种方式工作了。这可能是一个不好的方法:

我将从jquery获取数组的text_field更改为:

<%= text_field_tag 'tour[h_ids][]', nil %>
然后在我的控制器中我做了:

params[:tour][:hotel_ids] = params[:tour][:h_ids][0].split(',')

这有效,但我必须将h_ids添加到attr_accessor。对于那些稍后阅读编码器的人来说,它可能是一个很大的WTF ......但是这可以接受吗?

2 个答案:

答案 0 :(得分:3)

这是红宝石!

params[:tour][:hotel_ids][0].flatten!

应该做的伎俩!

ps:'!'这里很重要,因为它会导致'flatten'被保存到调用对象。

pps:对于那些与ruby相关的问题,我强烈建议您尝试使用 irb 脚本/控制台。你可以拿走你的对象并要求

object.inspect
object.methods
object.class

在调试和发现ruby可以为您做什么时,非常非常有用。

答案 1 :(得分:0)

只需在此处使用<%= text_field_tag 'tour[hotel_ids]', nil %>,然后像在示例中一样进行拆分。

你的例子中真正发生的是Rails在请求中得到param(-s)tour[hotel_ids][]并且它认为:“好吧,所以params[:tour][:hotel_ids]是一个数组,所以我只是推送每一个值使用此名称作为此数组的下一个值“,并且您得到了这个行为,您在params[:tour][:hotel_ids]数组中有一个元素,这是您的值(”1,2“)。如果您不需要(或不希望)将多个值分配给同一个参数,则不要创建数组(不要在名称的末尾添加[]

编辑:

你也可以轻松一点(如果你只想回答已发布的问题,而不是解决问题,为什么你现在有你想要的)并且只需将控制器中的行更改为:

params[:tour][:hotel_ids] = params[:tour][:hotel_ids][0].split(',')

#split返回数组,在您的示例中,您将此新数组分配给另一个数组的第一个位置。这就是你有数组阵列的原因。