Rails 4.0 强参数嵌套属性,其键指向哈希值

2024-04-19

我正在使用 Rails 4.x beta 并尝试让嵌套属性与 Carrierwave 一起使用。不确定我正在做的事情是否是正确的方向。经过一番搜索,最后查看了 Rails 源代码和强大的参数,我发现了以下注释。

# Note that if you use +permit+ in a key that points to a hash,
# it won't allow all the hash. You also need to specify which
# attributes inside the hash should be whitelisted.

https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb

所以它说你必须指定 has 中的每一个属性,我尝试了以下操作:

参数的例子:

{"utf8"=>"✓",
 "authenticity_token"=>"Tm54+v9DYdBtWJ7qPERWzdEBkWnDQfuAQrfT9UE8VD=",
 "screenshot"=>{
   "title"=>"afs",
   "assets_attributes"=>{
     "0"=>{
       "filename"=>#<ActionDispatch::Http::UploadedFile:0x00000004edbe40
                      @tempfile=#<File:/tmp/RackMultipart20130123-18328-navggd>,
                      @original_filename="EK000005.JPG",
                      @content_type="image/jpeg",
                      @headers="Content-Disposition: form-data; name=\"screenshot[assets_attributes][0][filename]\"; filename=\"EK000005.JPG\"\r\nContent-Type: image/jpeg\r\n">
     }
   }
 },
 "commit"=>"Create Screenshot"}

控制器

def screenshot_params
  params.require(:screenshot).permit(:title,
    :assets_attributes => [:filename => [:@tempfile,:@original_filename,:@content_type,:@headers] 

上面的内容不是“工作”(它不触发载波),但是当使用我发现的标准嵌套示例时,我不再收到错误(不允许的参数:文件名):

def screenshot_params
  params.require(:screenshot).permit(:title, assets_attributes: :filename)

如果有人能提供帮助那就太好了。我无法找到嵌套有指向哈希的键的示例。


我的另一个答案大部分是错误的 - 新答案。

在您的 params 哈希中, :filename 不与另一个哈希关联,它与 ActiveDispatch::Http::UploadedFile 对象关联。你的最后一行代码:

def screenshot_params
  params.require(:screenshot).permit(:title, assets_attributes: :filename)

实际上是正确的,但是,不允许使用文件名属性,因为它不是允许的属性之一标量类型 https://github.com/rails/rails/blob/16e0c8816c4c8a9fb5292278bf5753b026c1105c/actionpack/lib/action_controller/metal/strong_parameters.rb#L362。如果打开控制台,并初始化以下形状的 params 对象:

params = ActionController::Parameters.new screenshot: { title: "afa", assets_attributes: {"0" => {filename: 'a string'}}}

然后针对你的最后一行运行它:

p = params.require(:screenshot).permit(:title, assets_attributes: :filename)
# => {"title" => "afa", "assets_attributes"=>{"0"=>{"filename"=>"abc"}}}

但是,如果您对上传文件的 params 哈希执行相同的操作,您会得到

upload = ActionDispatch::Http::UplaodedFile.new tempfile: StringIO.new("abc"), filename: "abc"
params = ActionController::Parameters.new screenshot: { title: "afa", assets_attributes: {"0" => {filename: upload}}}
p = params.require(:screenshot).permit(:title, assets_attributes: :filename)

# => {"title" => "afa", "assets_attributes"=>{"0"=>{}}}

因此,可能值得对 Rails 进行 bug 或拉取请求,同时,您必须使用原始数据直接访问文件名参数params object:

params[:screenshot][:assets_attributes]["0"][:filename]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails 4.0 强参数嵌套属性,其键指向哈希值 的相关文章

  • 如何找出 gem 捆绑包将 gem 锁定在特定版本的原因?

    我正在尝试指定一个版本节俭宝石 http rubygems org gems thrift在我的宝石文件中 gem thrift gt 0 6 0 当我尝试跑步时bundle install 我收到此错误 You have requeste
  • ActiveRecord 迁移后的括号 [5.1] 是什么?它是如何工作的? [复制]

    这个问题在这里已经有答案了 使用生成新迁移时bin rails g migration CreateUser第一行如下所示 class CreateUser lt ActiveRecord Migration 5 1 什么是 5 1 代表什
  • 使用 Ruby on Rails ActiveSupport::Concern 功能时如何“嵌​​套”包含模块?

    我正在使用 Ruby 1 9 2 和 Ruby on Rails v3 2 2 gem 鉴于我正在使用 RoR 我想 嵌套 包含模块ActiveSupport 关注 http api rubyonrails org classes Acti
  • 如何在 ActiveAdmin 中正确配置 Rails 4.1 枚举

    我有一个 Rails 4 1 应用程序 其中使用枚举来表示对象的隐私级别 在我的架构中 t integer privacy level default 0 在我的模型中 enum privacy level privacy private
  • Rails 6 + Capistrano - 没有这样的 puma.sock 文件

    拜托 我有一个大问题10多个小时了 每当我使用 Capistrano 和 Puma 在 Rails 中运行应用程序部署并重新启动 nginx 时 当我尝试访问我的 Web 时 我会看到此错误 在此输入图像描述 https i stack i
  • 绕过标记为公开的特定记录的设计授权的最佳方法是什么

    我在 Rails 3 2 项目中使用 devise 和 cancan 我有一个event模型与一个 布尔标志public 如果事件被标记为公开 gt 真实那么我希望任何人 无论登录还是无法访问记录 GET events id 如果它被标记为
  • 在 rake 任务中运行 capybara

    如何在 Rake 任务中运行 Capybara 功能 例如 visit http google com 谢谢你 在任务中尝试这样的事情 require capybara require capybara dsl Capybara curre
  • Zurb Foundation 5,modernizr 未找到

    我在生产模式下使用 Foundation 5 0 2 0 时遇到此问题 在 Rails Unicorn NginX 和 Ubuntu 上 NetworkError 404 Not Found http mydomain com javasc
  • 保护客户端 API 的安全

    我正在为基于 JavaScript 的游戏构建服务器端 API 和客户端库 其中必须确保两个非常重要的功能的安全 用户每次游玩都必须扣款 我们必须确保提交的分数是玩家实际获得的分数 解决第一个问题看起来很简单 在每次游戏开始时 我们都会调用
  • Unit::Test 与 Rspec 之间的区别 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对感兴趣Test Unit and Rspec 有人可以向我解释一下两者之间的主要区别是什么 就它们的运作原理而言 测试 单位更类似于 JUn
  • 您是否在版本控制中添加公共/资产?

    在rails 3 1中 当您预编译资产时 rails会创建public assets目录并在其中添加文件 你对 public assets 进行版本控制吗 我使用 Capistrano 进行部署 最后一步是编译资产 类似的事情不会被检查到版
  • 文件上传字段导致 ActionController::InvalidAuthenticityToken 异常

    使用 Rails 4 并尝试使用 simple form 和回形针将文件字段添加到现有表单 这是表格的关键部分 一切正常 除非我实际提交带有上传文件的表单 然后 我得到这个 ActionController InvalidAuthentic
  • 在 selenium webdriver 中使用 phantomjs 代理

    我正在尝试在 selenium webdriver 2 25 的 ruby 1 8 7 脚本中使用 PhantomJS 1 9 1 配置代理 我看到了一些使用 Firefox 的例子 我用这个浏览器成功地做到了 我使用了这段代码 profi
  • 如何使用 ActionText 显示嵌入视频

    我正在尝试在 Rails 6 上使用 ActionText 显示嵌入式视频 无论是在 WYSIWYG Trix 中还是在渲染的内容中 但是 ActionText 渲染器会过滤所有原始 html 代码 并强制我使用 JS 在渲染内容中显示 i
  • 找到具有公共键的哈希数组的最大值?

    我有两个数组 每个数组包含任意数量的具有相同键但不同值的哈希值 ArrayA value abcd value length 4 type 0 value abcdefgh value length 8 type 1 ArrayB valu
  • Rails 3.2.6 中的延迟加载

    我在网上找到了一些资源 而不是在做类似的事情时 cars Car where colour gt black 查询不会执行 直到您执行以下操作 cars each c puts c name 但是 在我的 Rails 3 2 6 项目中 当
  • main:Object 的未定义方法“命名空间”(NoMethodError) - 活动记录/rakefile

    我正在尝试运行一个基本的 Sinatra 应用程序 当我进入 机架 步骤时 出现错误 rvm gems ruby 2 2 1 gems activerecord 4 2 1 lib active record railties databa
  • Rails 形式的当前日期

    我正在学习 Rails 并在书外进行一些探索 并随着知识的增长创建一个具有附加功能的简单应用程序 我正在编写一个简单的博客应用程序 我在表单中添加了一个名为 日期 的字段 我不希望这是一个字段 我希望它从服务器获取日期并将其自动放入数据库中
  • 下载位置 Selenium-webdriver Cucumber Chrome

    我正在使用 Cucumber 和 Ruby 当通过 Selenium Webdriver 在 Chrome 中运行测试时 我想将下载位置更改为测试文件夹而不是用户下载文件夹 我当前的 chrome 驱动程序设置如下 Capybara def
  • 设置 put 的行尾字符

    我有一系列想要打印的条目 Being arr数组 我只是用来写 puts arr 然后我需要使用DOS格式的行尾 r n 所以我写道 arr each e print e r n 这工作正常 但我想知道是否有一种方法可以指定要使用的行尾格式

随机推荐

  • Symfony 2 功能测试外部 URL

    无论我做什么 我总能得到一个 Symfony Component HttpKernel Exception NotFoundHttpException 否 已找到 的路线 in crawler gt text 当我尝试使用以下命令请求外部
  • 如何向 img 标签添加到期日期?

    我正在使用 Page Speed Firebug 扩展来帮助提高页面性能 我有一个包含大量图像的页面 它提出的建议之一是 利用浏览器缓存 以下可缓存资源的新鲜生命周期较短 指定以下资源至少在未来一周后到期 http www mysite c
  • 使用Jquery打印div内容

    我想使用 jQuery 打印 div 的内容 这个问题已经在 SO 中提出 但我找不到正确的 有效的 答案 这是我的 HTML div p This is a sample text for printing purpose p div
  • PostgreSQL 恢复后,我收到“关系 django_session 的权限被拒绝”

    我目前正在实时服务器和本地运行我的 Django 1 1 1 站点和 PostgreSQL 8 4 2 当我尝试从本地机器上的实时服务器恢复我的备份之一时 在本地访问我的站点时出现以下错误 http 本地主机 8000 http local
  • Nodejs 在异步上创建简单队列

    在下面的示例代码中 我可以同时运行多功能 Promise all sendMoneyToRequestedUser data saveTransferMoneyTransaction data then function results l
  • 如何在保存到数据库之前在JSP中转义html?

    我现在正在学习 JSP 和 Java 并写了一个 非常 简单的留言簿来开始使用 JSP 但我想确保没有人可以使用 CSS 因此我需要在将 HTML 代码保存到 mySQL 数据库之前删除它 我已经在这里搜索并找到了 PreparedStat
  • 更改 MVC 5 中的用户名 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在使用 ASP NET MVC5 和 Identity 2 0 测试版 用户可以更改用户名吗 我正在尝试使用 Use
  • IActionFilter 与 IResultFilter

    请解释一下 IActionFilter 和 IResultFilter 之间的区别 我了解 OnActionExecuting 发生在操作方法执行之前 OnActionExecuted 发生在操作方法执行之后 进一步了解执行操作方法意味着什
  • 如何让 firebase deploy --email 或 --token 参数起作用?

    我在使用这些 firebase 命令通过 firebase 部署 travis CI 时遇到问题 firebase deploy email FIREBASE USERNAME password FIREBASE PASSWORD fire
  • 通过javascript在html表格中动态添加一列

    我正在编写一个java脚本代码 它将在html中已经存在的表中动态附加一列复选框 我的 html 代码是这样的 table border 1 tr th Email id th th Em th tr table
  • QSignal Manager - 无法将多个信号连接到一个插槽

    我有 4 个 QLineEdits 和 4 个 QPushButtons 如果我单击 QPushButton 我想在相应的 QLineEdit 内设置一些文本 我想使用QSignalMapper来区分每个QButton及其对应的QLineE
  • 用于教育目的的公共 SQL 数据库

    我正在寻找一个可以免费访问的公开可用的 SQL 数据库 可以在其中运行一些SELECT免费查询一些有意义的数据 不是 item1 item2 item3 你见过吗 如果能附上一些教程就更好了 供应商并不那么重要 只要可以使用通用 JDBC
  • 复杂类型中的 XJC javaType 适配器

    我想让 XJC 在生成 bean 时在复杂类型中使用 javaType 标记 这是不允许的吗 我真的缺少好的文档和一些可以理解的错误消息 这是我正在尝试的操作 但失败并出现错误 编译器无法支持此转换自定义 它附加到错误的位置 或者与其他绑定
  • Django Rest Framework如何禁止用户更改用户名?

    我正在创造UserSerializer并希望允许用户创建新帐户但禁止他们更改用户名 有一个read only我可以应用该属性 但用户在创建新用户名时将无法设置用户名 但如果没有它 它允许我改变它 还有一个required不幸的是 该属性不能
  • Jquery 数据表主题隐藏页眉/页脚块

    我正在尝试删除该表的页眉 页脚块 Picture of what I am trying to remove 该表的Jquery代码 document ready function var oTable tableSmooth dataTa
  • 迭代器模式 - 错误 C2679:二进制 '<<':找不到采用 'std::string' 类型的右侧操作数的运算符 [重复]

    这个问题在这里已经有答案了 我正在尝试使用迭代器模式进行迭代和打印 但出现错误 这是错误 error C2679 binary lt lt no operator found which takes a right hand operand
  • C++11:如何使用 设置种子

    我正在练习随机库 这是 C 11 的新功能 我编写了以下最小程序 include
  • Angular 和 Sails 路由配置

    是否有任何 Sails js 或 Node 配置可以阻止 Angular 路由工作 无论我采取什么方法 除了 sails 的routes js 中的路线之外 每条路线都会返回 404 我尝试过 1 2 和 1 3 Angular 版本 并且
  • 部署到 Digital Ocean 的 Meteor 应用卡在 100% CPU 和 OOM

    我有一个使用 Meteor Up 部署到 Digital Ocean 的 Meteor 0 8 0 应用程序 该应用程序一直卡在 100 CPU 只是因内存不足而崩溃 然后以 100 CPU 再次启动 过去24小时就这样卡住了 奇怪的是没有
  • Rails 4.0 强参数嵌套属性,其键指向哈希值

    我正在使用 Rails 4 x beta 并尝试让嵌套属性与 Carrierwave 一起使用 不确定我正在做的事情是否是正确的方向 经过一番搜索 最后查看了 Rails 源代码和强大的参数 我发现了以下注释 Note that if yo