修改ruby哈希到位(轨道强劲的参数)
这可能是更多的ruby问题然后轨道问题,但我敢肯定,我能够在香草ruby应用程序中做到这一点。
我有很强的参数定义。
def trip_params params.require(:trip).permit(:name, :date) end
现在我用控制器方法得到这些参数。 我想做这个。
def save trip_params[:name] = 'Modifying name in place' #trip_params[:name] still equals original value passed end
这从来没有工作。 名字从不改变 。 BTW:trip_params的types是ActionController :: Parameters
如果我做一个标准的ruby脚本,它的工作原理。
test = {} test[:name] = "blah" test[:name] = "ok" puts test #{:name=>"ok"}
permit
返回一个新的哈希与它的键,所以你不修改真正的params
variables。 你也没有保存对trip_params返回值的引用,所以你可以在save
获得新的每个调用。
尝试这个:
def save tp = trip_params tp[:name] = 'Modifying name in place' # ... use tp later, it'll be in there end
或者,如果您确实希望以前用过的方式使用它,请修改trip_params
如下所示:
def trip_params @trip_params ||= params.require(:trip).permit(:name, :date) end
现在散列已经被caching了,并且在随后的trip_params
调用中返回相同的散列。
如果你真的想在控制器中改变参数,你可以这样做:
def save params[:trip][:name] = 'Modifying name in place' # Now trip_params[:name] is 'Modifying name in place' end
这是因为没有像trip_params[]=(arg, val).
我的意思是,当你调用trip_params时,你会返回params.require(:trip).permit(:name, :date)
,所以每次调用trip_params
都会得到params。
所以,如果我是你,我会定义trip_params方法如下:
def trip_params @trip_params ||= params.require(:trip).permit(:name, :date) end
还会定义一个方法来改变trip_params
def trip_params[]= (key,val) trip_params # Ensure that trip_params is called once or you will get an error @trip_params[key] = val end
所以现在当你调用trip_params
你实际上会返回@trip_params
,如果@trip_params
没有设置,它会设置为params.require(:trip).permit(:name, :date)
然后,当你调用trip_params[:name] = "Some name"
,它将确保首先通过调用trip_params and then it will set the :name param to
来初始化trip_params and then it will set the :name param to
“Some name”
希望我帮你
你也可以做
def save data = trip_params.merge(name: 'new name') # use data later end
如果一个新的散列被合并到一个旧的散列,并且如果有重复的键,新的散列的键将覆盖旧的散列的匹配键。