修改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返回一个新的哈希与它的键,所以你不修改真正的paramsvariables。 你也没有保存对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 

如果一个新的散列被合并到一个旧的散列,并且如果有重复的键,新的散列的键将覆盖旧的散列的匹配键。

👍🏼