我正在尝试为我的表单压扁一个数组。
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 ......但是这可以接受吗?
答案 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
返回数组,在您的示例中,您将此新数组分配给另一个数组的第一个位置。这就是你有数组阵列的原因。