我有这个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函数将元素附加到文档中。
答案 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中的每个表达式都返回上次执行的命令的值,因此&&
返回左表达式返回的任何内容(如果它是假的(false
或nil
),否则它会在其右侧运行表达式并返回其值。在Ruby的这个上下文中使用这个&&
是很常见的。