这可能更像是一个ruby问题,而不是rails问题,但我很确定我能够在一个普通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

这是行不通的.Name never changes

如果我使用标准的ruby脚本,它就会工作.

test = {}    
test[:name] = "blah"    
test[:name] = "ok"    
puts test #{:name=>"ok"}

推荐答案

permit返回一个包含这些键的新散列,因此您没有修改真正的params变量.您也没有保存对hash 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

现在,散列被延迟缓存,并且在随后的trip_params次调用中返回相同的散列.

Ruby相关问答推荐

有没有更好的方法来加入剩余不变的子列表?

以编程方式获得完整的 Ruby 版本?

如何在新行之间拆分字符串并保留空白行?

在Ruby中将关键字与常规参数混合?

是否有Ruby单行如果 x 则返回?

如何正确截断表格?

Ruby - 将块传递给方法

在 Ruby 中将数组转换为索引哈希

如何将消息附加到 RSpec 判断?

Rails - RSpec - let和let!之间的区别

Vagrant - 如何拥有特定于主机平台的配置步骤

如何绘制 git repo 的代码行历史记录?

Ruby 被空格分割

如何只获取没有命名空间的类名

如何在 Ruby 中做标准差?

Xcode - 配置:错误:在 $PATH 中找不到可接受的 C 编译器

在ruby中将字符串转换为十进制数

将整个文本文件作为单个字符串读取的合理方法是什么?

使用哈希值呈现 ERB 模板

如何在 Ruby 中将时间四舍五入到最接近的 15 分钟?