首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

rails深度嵌套的form_for不能保存两次

问题描述:rails深度嵌套的form_for不能保存两次。

回答: 在Rails中,form_for是一个用于生成表单的辅助方法。当表单中存在深度嵌套的关联关系时,可能会遇到无法保存两次的问题。

解决这个问题的方法是使用accepts_nested_attributes_for和fields_for两个方法。

  1. accepts_nested_attributes_for:这个方法用于在模型中声明接受嵌套属性的关联关系。在父模型中使用该方法,可以告诉Rails接受子模型的属性。

例如,如果有一个User模型和一个Profile模型,User模型拥有一个Profile模型的关联关系,可以在User模型中添加以下代码:

代码语言:txt
复制
class User < ApplicationRecord
  has_one :profile
  accepts_nested_attributes_for :profile
end
  1. fields_for:这个方法用于在表单中生成嵌套属性的字段。在父模型的表单中使用该方法,可以生成子模型的字段。

例如,在创建或编辑User模型的表单中,可以添加以下代码:

代码语言:txt
复制
<%= form_for @user do |f| %>
  <%= f.fields_for :profile do |profile_fields| %>
    <%= profile_fields.text_field :name %>
  <% end %>
  <%= f.submit %>
<% end %>

这样,当提交表单时,父模型和子模型的属性都会被保存。

需要注意的是,如果在控制器中使用了strong parameters,需要确保允许接受嵌套属性。可以在控制器的参数列表中添加嵌套属性的键。

代码语言:txt
复制
def user_params
  params.require(:user).permit(:name, profile_attributes: [:name])
end

这样,就可以成功保存深度嵌套的form_for表单两次了。

推荐的腾讯云相关产品:腾讯云云服务器(CVM)和腾讯云数据库(TencentDB)。

  • 腾讯云云服务器(CVM):提供可扩展的云服务器实例,适用于各种规模的应用程序和工作负载。详情请参考:腾讯云云服务器
  • 腾讯云数据库(TencentDB):提供高性能、可扩展的数据库服务,包括关系型数据库(MySQL、SQL Server、PostgreSQL)和非关系型数据库(MongoDB、Redis)。详情请参考:腾讯云数据库
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

RESTful API设计系列三:URLs

API设计者认为有用信息,比如:操作状态简短描述、统计信息等。 URL结构 API中每个集合和资源都有自己URL。URLs不能通过客户端来构造。客户端只能使用API生成链接。...推荐URL规范是在API入口点后添加可用集合或者资源路径。这最好通过例子来描述。下图表格来自Rails“路由”实现,使用“:name”URL变量风格。...under resource “id” /api/:coll/:id/:subcoll/:subid The resource “subid” inside “subcoll” 尽管子集合可能有任意层嵌套...,以我个人经验,如果可以的话最好把嵌套深度限制在2以内。...这相当于资源热插拔(This amounts to a hot plug/unplug of the resource),这与改变已经保存表示是完全不同操作。

77110

如何使用本地 Docker 更好地开发?我们总结了这八条经验

这样做并不常见——大多数应用程序和框架都需要一定数量镜像基础(例如,Rails 需要 Node),但如果你发现自己 Dockerfile 只包含一个 FROM 行,你就可以不使用这个文件。...举个例子,假设有个 Rails 应用程序使用一个共享镜像来运行开发服务器和 webpack-dev-server,那么配置可能像这样: services: rails: image: appname_rails...如果我们省略 image: 指令同时复制 build:,就会构建完全相同镜像两次,这样会浪费磁盘空间和有限时间。...:/app - yarn:/app/node_modules 命名卷挂载点可能因不同软件栈而异,但原则是差不多:将编译后依赖项保存在已命名卷中,以大幅缩短启动时间。...5 将临时东西放入命名卷中 上一点提到使用命名卷来提高性能,这里有另一个有用技巧:将保存只读文件目录放入命名卷中,阻止它们被同步回本地机器(这会带来很大性能开销),特别是 log 和 tmp

2K40

Gitlab环境搭建小计

/gitlab-*,释放初始配置到/etc/gitlab目录 执行 gitlab-ctl reconfigure之后,在/var/opt/gitlab 下保存配置和数据 gitlab实际上里面包含了很多东西...,rails、redis、nginx、ruby等,如果有自己相应服务的话,得记得端口冲突问题。...比如我一开始就有端口和unicorn默认端口(8080)冲突 接下来要改默认配置,然后坑就来了: 首先是生成/var/opt/gitlab里面的路径不能是软链接,我把git仓库保存路径软链接后发现push...要求passenger模块,所以不能直接用官方提供方法。...,不然项目比较大时候创建Merge Request比较慢,比较容易超时 不能软链接这回事非常头大,开来只能用mount了,不过我没试过。

1.1K10

菜鸟刷题Day6

但是你直接从零位置开始累加的话不一定会得到前缀和能为零,所以这里可以考虑使用嵌套循环,也就是说如果从第一个位置累加不能为零,那么就从第二个位置再累加一次。...但是这样要走两次循环,后面我有思考了一下发现可以直接相加。...类似地,可以定义任何有效括号字符串 S 嵌套深度 depth(S): depth(“”) = 0 depth© = 0,其中 C 是单个字符字符串,且该字符不是 “(” 或者 “)” depth...给你一个 有效括号字符串 s,返回该字符串 s 嵌套深度 。 示例 1: 输入:s = "(1+(2*3)+((8)/4))+1" 输出:3 解释:数字 8 在嵌套 3 层括号中。...也就是说如果是 “( ”则size–,如果是 “ )”则size++,以此来表示栈内容量变化。在不断入栈出栈过程中,size最大值就是括号最大嵌套深度,因为s是一个有效括号字符串。

23100

Rails路由

end 但是显然嵌套太深是非常麻烦,经验告诉我们嵌套资源层级不应该超过一层,而避免嵌套过深方法之一就是把动作集合放在父资源中,这样既可以表明层级关系,又不必嵌套成员动作: resources :articles...会自动确定对应路由: Rails能够识别各个实例,自动使用 magazine_ad_path...: {format: 'jpg'} Rails会把 /photos/12 路径映射到 Photos#show 动作上,并把 params[:format] 设为 'jpg' 当然 defaults 还有块形式...,但不能使用 ^ 符号,比如下面就是错误: get '/:id', to: 'articles#show', constraints: { id: /^\d/ } 路由通配符和通配符片段 路由通配符用于指定特殊参数...和 edit 动作上 限制创建路由 Rails 默认会为每个 REST 式路由创建7个默认动作,可以使用 :only 和 :except 选项来微调此行为。

4.4K20

【说站】js对象读取速度

js对象读取速度 1、访问字面量和局部变量最快,而访问数组元素和对象成员相对较慢。访问对象成员时,就像作用域链一样,在原型链上搜索。...2、如果找到成员在原型链中位置太深,访问速度就会变慢。 所以要尽量减少对象成员搜索次数和嵌套深度。...实例  // 进行两次对象成员查找   function hasEitherClass(element, className1, className2) {     return element.className... === className1 || element.className === className2;   }   // 优化,如果该变量不会改变,则可以使用局部变量保存查找内容   function...element.className;     return currentClassName === className1 || currentClassName === className2;   } 以上就是js对象读取速度介绍

4.3K30

【说站】javascript访问不同对象速度比较

javascript访问不同对象速度比较 速度比较 1、访问字面量和局部变量速度最快,而访问数组元素和对象成员相对较慢。 2、访问对象成员时,查找成员在原型链位置太深,则访问速度越慢。...提示 应该尽可能减少对象成员查找次数和嵌套深度。...实例   // 进行两次对象成员查找   function hasEitherClass(element, className1, className2) {     return element.className... === className1 || element.className === className2;   }   // 优化,如果该变量不会改变,则可以使用局部变量保存查找内容   function...    return currentClassName === className1 || currentClassName === className2;   } 以上就是javascript访问不同对象速度比较

63410

“技术邪教” Ruby on Rails 之父再出激进言论引争议

在近日 Rails World 大会上,Ruby on Rails 之父、37signals 联合创始人兼首席技术官 DHH(David Heinemeier Hansson)发表了观点称,最快打包工具就是没有构建...这让我非常兴奋,也是我们目前主要开发方式。” 没有构建理念正在迅速普及,如今也已经进入了 CSS,并推出了大受欢迎 CSS 嵌套功能。...DHH 透露,现在 37 Signals 新应用开发中也在运用这两大功能:无需构建 JS 代码和无需构建 CSS。“之前我们就考虑过使用嵌套和变量来回避构建。...DHH 不认可 Malte Ubl 所说 “行不通”。他表示,这就是技术讨论奇怪之处。即便已经有案例证明项目能完成大规模任务(如 Rails 之于 Shopify),但人们也会声称它不能进行扩展。...Rails 开发者 Niklas Häusele 表示,“我喜欢用‘No Build’方式进行本地开发。无需等待即可刷新,这就是最高生产力。

25010

《高性能 MySQL》读书笔记

但是有下列问题,一个事务中两次读取同一个数据,由于这个数据可能被另一个事务提交了两次,所以会出现两次不同结果,所以这个级别又叫做不可重复读。...这里不一样数据包括虚读(两次结果不同)和幻读(出现新或者缺少了某数据)。...4、mysql客户端和服务器之间通信协议是半双工,任何一个时刻只能单向发送数据而不能两边同时进行,像是抛绣球。...MYSQL对任何关联都执行嵌套循环关联操作,即先在一个表中循环取出单条数据,然后嵌套循环到下一个表中寻找匹配行,依次下去,直到找到所有表中匹配行为为止。...任何多表查询都可以用一棵树来表示,比如四表查询: 而事实上MYSQL总是从一个表开始一直嵌套循环,是一颗左侧深度优先树。 ? ?

1.5K20

GitLab技术选型为何如此不同:坚持用过气Web框架十多年、坚决不用微服务

不过人气并不能直接说明语言质量差,一方面 Ruby on Rails(用 Ruby 写开源 Web 应用程序框架)仍是实现原型设计演示好方法,能帮助开发者在几天之内更稳妥地构建起最小可行性产品,另一方面...David 曾在一个采访中回顾他创造 Ruby on Rails 心路历程,其中最大影响来自他使用 PHP 与 Java 深度经验。...微服务并不能降低复杂性,所以想象中模块化改进最终带来很可能只是一团永远理不清头绪乱麻。...Sid Sijbrandij 表示,虽然将 GitLab 构建成单体最符合项目预期,但对于具体结构取舍也绝不能太过教条。总之,架构要为需求服务,而非需求为架构服务。...尽管 Rails 本身并不能实现这一点,这是那些出色贡献者和工程师们完成,但 Rails 还是为这些成功奠定了基础。

84620

MySQL系列之事务编程学习笔记

,或者一起回滚 带有保存扁平事务,因为扁平事务局限性,不能支持部分事务回滚,所以就有了带保存扁平事务,这种事务能通过savepoint命令保存一个保存点,需要rollback时候,使用命令ROLLBACK...也不能回滚到最近保存点,所以就有了链事务出现,链事务能做出现系统奔溃情况,回滚到最近保存点,当然在mysql系统中默认是不开启,链事务是作用是,在提交一个事务时,释放不需要数据对象,将必要上下文隐式传给下一个开始事务...,不过带保存点事务能做到回滚到指定保存嵌套事务,嵌套事务从名称就可以理解,这种一种层次结构嵌套事务,有一个顶级事务(top-level transaction)控制着各个子事务(subtransaction...),这种子事务可以是扁平事务、带保存扁平事务、链事务等等 引用书中嵌套式事务特征 可以归纳重点,这种嵌套事务其实可以理解为一种树形结构,分为顶级事务,子事务,整个事务需要顶级事务提交后才真正算提交...会在每一行数据上都加上锁,SERIALIZABLE虽然可以保证事务安全性,不过服务器性能不好也会导致锁争用问题 脏读:是指读取了未提交事务数据 不可重复读:是指两次查询得出结果是不一致,因为在两次查询之间

39210

不要让框架控制你项目,过度依赖框架会害了你

换句话说,用户可以扩展框架,但不能修改其代码。 根据定义,框架主要功能是提供功能、行为、流程和默认值,而且所有这些都是框架内置,其中一些是不可更改或指定。...框架允许用户添加代码,但不能更改其代码。 所有的软件框架都可能引入维护问题,但我个人使用框架经验仅限于Web服务(API、后端、全栈)、命令行和GUI。...第三种危害是,框架使用导致我们需要付出额外努力,但这部分工作并不能为客户提供价值,比如框架升级、弃用、教育和信息摄入(例如学习新功能)等。...然而,在选择框架构建产品时,你就与它深度绑定了。永远绑定了。在项目之初,在拥有的信息量最少那一刻,你却做出了最关键决定。...框架构建初衷就是为了控制你项目 使用框架开发软件时,项目必然会与框架深度绑定。

75030

【漏洞预警】GitLab曝高危漏洞,可致private token等敏感信息泄露

这些secret都经过加密,需要密钥才能解密,并且不能在没有用户密码情况下使用。尽管如此, 还是建议先将一次性密码功能关闭然后再重新打开,从而重置OTP secret。...重置用户Tokens步骤 使用Omnibus用户将下面的源码保存到: /opt/gitlab/embedded/service/gitlab-rails/lib/tasks/reset_token.rake...使用源码安装用户保存到: /lib/tasks/reset_token.rake Omnibus用户运行 sudo gitlab-rake tokens...=production sudo -u git -H bundle exec rake tokens:reset_all_email RAILS_ENV=production 执行完所有操作后可以把rake...临时补丁 对于某些无法升级用户可以使用以下补丁: Omnibus用户: $ cd /opt/gitlab/embedded/service/gitlab-rails/$ git apply <path_to_diff

1.4K100

栈帧之局部变量表(Local Variables)解读

由于局部变量表是建立在线程栈上,是线程私有数据,因此不存在数据安全问题 局部变量表所需容量大小是在编译期确定下来,并保存在方法Code属性maximum local variables数据项中...在方法运行期间是不会改变局部变量表大小。 方法嵌套调用次数由栈大小决定。一般来说,栈越大,方法嵌套调用次数越多。...对一个函数而言,它参数和局部变量越多,使得局部变量表膨胀,它栈帧就越大,以满足方法调用所需传递信息增大需求。进而函数调用就会占用更多栈空间,导致其嵌套调用次数就会减少。...(因为局部变量表是一个数组,数组大小不能动态进行调整) public class SlotTest { public void localVarl() { int a = 0...我们知道类变量表有两次初始化机会,第一次是在“准备阶段”,执行系统初始化,对类变量设置零值,另一次则是在“初始化”阶段,赋予程序员在代码中定义初始值。

16730

GitLab → 搭建中常遇问题与日常维护

,没按官方推荐(内存最少 4G)来,弄了个 2G 内存,一顿操作猛如虎,定睛一看原地杵,特么竟然像泰山一样稳,进度在那一动不动     直接卡住是比较烦,因为不能直观地看出是否真的是卡住了,还是在安装中...,只能凭感觉、经验来判断;如果出现如下类似错误信息 * execute[clear the gitlab-rails cache] action run ========================...(网上说而基本都是 gitlab-rails console production ),推荐大家直接上 GitLab 官网去找对应版本命令     当出现如下信息表示我们成功登入控制台 [root@...修改密码     执行命令: user.password = 'secret_pass' 修改密码, user.password_confirmation = 'secret_pass' 确认密码   4、保存密码...取消 Sign-up enabled 前复选框勾选,保存就好了   退出登录后可以发现,登录页注册功能没了,既然不能注册了,那么就需要通过 root 用户来添加账号了   添加单个账号的话,可以直接通过管理中心来添加

2.9K20

GitLab 服务器迁移以及注意点

环境 CentOS:7.4 GitLab:10.6.4 新服务器安装 GitLab 安装方法可以按照上面文章中步骤,但需要注意是,新服务器上装 GitLab 版本和原服务器 GtiLab 版本保持一致...通过下面的命令可以查看原服务器上 GitLab 版本: cat /opt/gitlab/embedded/service/gitlab-rails/VERSION 安装指定版本命令如下: yum...,那么文件编号为:1615384704_2021_03_10_10.6.4 中间会有两次这种交互式提示,输入 yes 让其继续执行就可以还原成功。...,如下图: 需要修改 GitLab 配置文件来进行解决,进入到内网 GitLab 服务器,执行下面命令编辑配置文件: vi /opt/gitlab/embedded/service/gitlab-rails...像今天这篇就属于此类,我大概解答下: 我在做这些操作实践时是也是通过了大量搜索,因为使用场景、软件版本等各方面的原因,往往不能一次性成功,还是需要不断尝试,所以我在写这类文章时在开头就会注明环境。

1.9K20
领券