修改ruby hash到位(rails strong params)

时间:2013-08-22 00:03:31

标签: ruby ruby-on-rails-4

这可能是一个红宝石问题,然后是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"}

4 个答案:

答案 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

如果将新哈希合并到旧哈希中并且如果存在重复键,则新哈希键将覆盖旧哈希的匹配键。