检查params是否通过

时间:2014-03-25 14:19:07

标签: javascript ruby-on-rails ruby

我有这个Javascript函数,我用来附加元素做我的表单。提交表单时,所有元素都以params形式传递。

这是问题所在。我的函数附加的元素是Hash的一部分。这基本上用作rails“嵌套属性”。

所有似乎都工作正常,除非其中一个“哈希”是空的。当我删除集合中的所有元素时,哈希参数不会传递给控制器​​。

示例(想象一下,我使用我的JS功能附加了本田,丰田,现代)

汽车 [本田] [丰田] [现代]

这是在JS函数中设置哈希的方式(每次我点击“添加”):

CarsHash.name= "cars_hash"+"["+"tmp_cars"+"]"+"["+i+"]"+"car_name"

如果我要提交表单,则值将作为Hash传递给控制器​​,如下所示:

cars_hash=>{tmp_cars=>"{"1"=>{car_brand=> "honda"},"2"=>{car_brand=> "toyoda"},"3"=>{car_brand=> "hyundai"}"}

但是,如果我决定从散列中删除所有这些值(使用也具有JS功能中所述功能的删除按钮)并提交表单,则Hash甚至不作为参数出现。然后,当我到达我的控制器并尝试填充我用于迭代/插入我的数据库的变量时:

控制器

cars_hash = params[:cars_hash][tmp_cars]

它给了我这个错误:

undefined method `[]' for nil:NilClass

据我所知,这个参数甚至不存在所以它基本上是零。我尝试了所有这些可能的选择:

if not params[:cars]["tmp_cars"].blank?
if not params[:cars]["tmp_cars"].empty?
if params[:cars]["tmp_cars"].present?
if params[:cars]["tmp_cars"] != nil

但没有运气。有谁能建议我让这个工作的方法?同样,如果将哈希值作为值,则param将不会为nil。要使它具有值,必须通过JS函数将元素附加到文档中。

1 个答案:

答案 0 :(得分:1)

尝试做:

cars_hash = params[:cars_hash] && params[:cars_hash][tmp_cars]

我强烈建议安装andand gem,这对于这样的情况非常适合。有了这个宝石你可以像上面的代码那样:

cars_hash = params[:cars_hash].andand[tmp_cars]

更新:

您的代码无效,因为params[:cars_hash]返回了nil,您尝试调用[]方法,并且没有为nil对象定义此类方法。因此,在调用任何内容之前,您需要检查params[:cars_hash]是否为零。

&&运算符有这个很好的属性,它甚至没有执行正确的参数,因为左参数是假的 - 没有必要这样做。由于ruby中的每个表达式都返回上次执行的命令的值,因此&&返回左表达式返回的任何内容(如果它是假的(falsenil),否则它会在其右侧运行表达式并返回其值。在Ruby的这个上下文中使用这个&&是很常见的。