这可能是一个红宝石问题,然后是rails问题,但我很确定我能够在vanilla 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的类型是ActionController :: Parameters
如果我使用标准的ruby脚本,它可以正常工作。
test = {}
test[:name] = "blah"
test[:name] = "ok"
puts test #{:name=>"ok"}
答案 0 :(得分:53)
permit
会返回包含这些键的新哈希值,因此您不会修改真实的params
变量。你也没有保存对hash_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
现在,哈希被缓慢地缓存,并且在随后的trip_params
次调用中返回相同的哈希值。
答案 1 :(得分:23)
如果您真的想要更改控制器中的参数,您可以这样做:
def save
params[:trip][:name] = 'Modifying name in place'
# Now trip_params[:name] is 'Modifying name in place'
end
答案 2 :(得分:2)
这是因为没有诸如trip_params[]=(arg, val).
我的意思是,当你打电话给trip_params时,你会返回params.require(:trip).permit(:name, :date)
的值,所以每当你拨打trip_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
来确保初始化trip_params and then it will set the :name param to
“某个名称”`
希望我帮助过你
答案 3 :(得分:2)
您也可以
def save
data = trip_params.merge(name: 'new name')
# use data later
end
如果将新哈希合并到旧哈希中并且如果存在重复键,则新哈希键将覆盖旧哈希的匹配键。