通过Rails中的params散列传递ActiveRecord数组

时间:2014-06-26 01:26:04

标签: ruby-on-rails

当我通过params hash传递@dispensers时,我得到了:

@dispensers = "[#<Dispenser id: 38084, firstname: \"x\", lastname: \"A Lane\", created_at: \"2014-06-24 20:33:30\", updated_at: \"2014-06-24 20:33:30\", user_id: nil, public: true, birth_date: nil, university_id: nil, business_id: 29, branch_id: 38057, latitude: 30.3509, longitude: -97.7505, score: nil, gmaps: nil, full_name: \"Laura A Lane\", sex: \"F\", premium: false, slug: nil, public_reviews_on: true, bio: nil>, #<Dispenser id: 38102, firstname: \"x\", lastname: \"Woodall\", created_at: \"2014-06-24 20:33:31\", updated_at: \"2014-06-24 20:33:31\", user_id: nil, public: true, birth_date: nil, university_id: nil, business_id: 29, branch_id: 38075, latitude: 30.3379, longitude: -97.7593, score: nil, gmaps: nil, full_name: \"Ashley Woodall\", sex: \"F\", premium: false, slug: nil, public_reviews_on: true, bio: nil>

我想将其转换回可行的activerecord数组,但是当我运行

@dispensers.to_a我看到undefined method 'to_a' for #<String:0x0000000ebf30c0>

更新

感谢Jorge,我已经找到了解决方案。

dispensers = params[:dispensers]
array = dispensers.split(',').select{|s| s =~ /Dispenser id/}
ids = array.map {|x| x[/\d+/]}
@dispensers = Dispenser.find(ids)

1 个答案:

答案 0 :(得分:1)

你没有物体。你有一个字符串。您可以将字符串转换为数组,并且数组的内容不会成为对象。如果要在对象中转换它,则必须解析该字符串。解压缩密钥并将它们作为参数传递给Dispenser类的新实例。 这个问题主要与如何解析这个问题有关。

对于像单个方法这样的东西,这个结构似乎很复杂,也许你想学习如何构建自己的解析器:

http://thingsaaronmade.com/blog/a-quick-intro-to-writing-a-parser-using-treetop.html

有些步骤可能是:

选择数组符号,并拆分对象:

array = string[1..-1].split('>,')

然后,您将拥有一个对象属性字符串数组,您需要将其作为属性和值解析的哈希值转换为哈希值。最后一步应该是创建一个新对象。 (这部分是最难的)

其他选项可能是提取IDS:

array = string.split(',').select{|s| s =~ /Dispenser id/}

然后

ids = array.map {|id| id[17,10].to_i}

<强>声明: 这不是最好的方法。这不可重复使用。但为此 问题,这可能有所帮助。