使用accepts_nested_attributes_for创建新记录或更新现有记录

2023-12-12

阅读重大更新以获取最新信息。

嘿大家,

我在 Rails 应用程序中有一个多对多关系,涉及三个表:用户表、兴趣表和连接 user_interests 表,该表也有一个评级值,以便用户可以对他们的每个兴趣进行评级1-10 级。

我基本上是在寻找一种方法,让新用户在注册时创建他们的评级,并在将来的日期同时编辑他们的评级以及他们的任何个人资料信息。

我试图遵循这个问题Rails 嵌套形式 has_many :through,如何编辑连接模型的属性?但我遇到的问题是尝试将选择列表合并到组合中,并为用户提供多种兴趣评分。

型号代码:

user.rb
has_many :user_interests, :dependent => :destroy
has_many :interests, :through => :user_interests, :foreign_key => :user_id  
accepts_nested_attributes_for :user_interests

interest.rb
has_many :user_interests, :dependent => :destroy
has_many :users, :through => :user_interests, :foreign_key => :interest_id, :dependent => :destroy

user_interest.rb
belongs_to :user
belongs_to :interest

查看代码:

app/views/user/_form.html.erb
<%= form_for(@user) do |form| %>
  ... user fields
  <%= form.fields_for :user_interests do |ui_form| %>
    ... loop through ALL interests
    <% Interest.all.each do |interest| %>
      <%= ui_form.select :rating, options_for_select(1..10) %>
      <%= ui_form.hidden_field :interest_id, :value => interest.id %>
    <% end %>
  <% end %>
<% end %>

我还在控制器的新建/编辑操作中包含了以下内容@user.interests.build.build_interest

我遇到的问题是,当我想要多个利率时,参数哈希中只传递一个利率。我还收到 Rails 抛出的异常

Interest(#2172840620) expected, got Array(#2148226700)

我错过或弄错了哪些微小细节导致了问题?

EDIT:

我找到了一种强制其工作的方法,但它需要在 chrome 开发人员工具中手动编辑 HTML,我的表单元素的 :name 属性正在生成为user[user_interests_attributes][rating]但如果我把它改成user[user_interests_attributes][][rating]当我更新记录时它会起作用。但是,我无法手动指定绑定到表单对象的表单元素的 :name 。那么我该怎么做才能表明多个利率评级正在被通过,而不仅仅是 Rails 认为的一个呢?

大更新:

我得到了一个半功能版本,有一些细微的变化:

查看代码:

<% form.fields_for :user_interests do |ui_form| %>
<p>
    <%= ui_form.select :rating, options_for_select(1..5), :selected => :rating %>
    <%= ui_form.label :interest_title %>
    <%= ui_form.hidden_field :interest_id %>
</p>
<% end %>

控制器代码:

def new
  @user = User.new
  Interest.all.each { |int| @user.user_interests.build({ :interest_id => int.id }) }
end

def edit
  @user = @current_user
  Interest.unrated_by_user_id(@user.id).each { |int| @user.user_interests.build({ :interest_id => int.id }) }
end

现在,如果不存在评级,我可以编辑并更新或创建我的 user_interests,但当我尝试创建新用户时,出现用户为空的错误。此外,我无法访问表单中的任何兴趣属性来显示用户实际评分的兴趣。任何人都可以帮助解决这些警告吗?


你只需要@user.interests.build因为它是一个 has_many 关系。build_interest适用于存在 has_one/belongs_to 关系的情况。

使用时fields_for :user_interests您告诉用户模型,当创建/更新用户时,一个或多个 user_interest 对象的实例将位于参数哈希中。该表单不会创建或更新任何 user_interests,但会发回 user_interest_attributes 哈希值数组,这些哈希值表示表单引用的用户的 user_interests。这是一个 user_interests 评级值的数组,当您在表单中引用它们时,不存在 user_interests 评级值,这就是您收到错误的原因。

由于您正在将范围传递给select表单助手实际上您并没有为表单提供任何兴趣以供选择。 select 将为 user_interests 表中的 rating 列设置一个介于 1 到 10 之间的值。即使 user_interests 表具有 rating 列,也不存在用于设置评级的 user_interest。

passing :multiple => true在选择标签的选项哈希中将创建一个多重选择列表,但我认为这不是您想要的。我认为您希望页面上的许多项目用户可以对其进行兴趣评级。

如果您确实希望用户能够选择许多兴趣,这是如何在 a 上使用 fields_for 和 Accepts_nested_attributes_forhas_many :through关系:

<%= form_for(@user) do |f| %>
  <% f.fields_for :interest_ids  do |interest| %>
    <ul>
      <% Interest.all.each do |choice,i| %>
      <li class="selection">
        <%= interest.check_box [], { :checked => f.object.user_interest_ids.include?(choice.id) }, choice.id, ''  %>
        <%= interest.label [], choice.name %>
      </li>
    <% end %>
    </ul>
  <% end %>
<% end %>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用accepts_nested_attributes_for创建新记录或更新现有记录 的相关文章

  • 如何在 rake 任务中包含 ActionMailer 类?

    我想在我的 rake 任务中使用 ActionMailer 以便在特定时间向人们发送电子邮件 我在 app mailers 文件夹中编写了一个邮件程序类 如下所示 class AlertsMailer lt ActionMailer Bas
  • Rails 3.1 使用 app/assets/images/subdirectory 下的图像

    在我的 Rails 3 1 应用程序中 我将图像存储在app assets images jquery ui 我不知道如何在 CSS 中访问这些 assets image name png and assets jquery ui imag
  • 如何设置“attr_accessible”以便不允许使用 Ruby on Rails 访问模型的任何字段?

    如果在模型文件中我只有以下代码 class Users lt ActiveRecord Base end 这意味着什么 与模型相关的所有属性是否均可访问 我如何设置 attr accessible 以便not允许访问any领域的for那个型
  • 使用 Rails 进行 Paypal 自适应(链式)支付

    众所周知 PayPal 支持自适应 链式 支付 其中一个买家发送款项 并使用一个 API 帐户持有人进行处理 并且该款项可以发送给多个 用户 我的问题是 这个方法是否也支持 接受信用卡 对于 买方 是否可以抓卡 详细信息请访问我们的网站并使
  • 如何使用 rspec 测试 mandrill api

    因此 我的客户报告说 许多电子邮件都发给了错误的人 我想编写一些功能测试来查找并确保他们收到电子邮件以及我的规格中的内容 我有 mandrill mailer 它使用 mandrill api 在它发送之前我想看看消息是什么 例如 创建新用
  • Rails 序列化数据验证

    我有一个通过默认 AR 行为序列化为 YAML 的字段 例如 它目前位于哈希数组中 name gt hi url gt bye name gt hi url gt bye name gt hi url gt bye 有没有办法可以在其中一些
  • Rails 返回 JSON 序列化属性 with_in Different_access

    我以前有 serialize params JSON 但这会返回 JSON 并将哈希键符号转换为字符串 我想使用符号引用哈希 这在使用哈希时最常见 我向它提供符号 Rails 返回字符串 为了避免这种情况 我创建了自己的 getter se
  • 如何在 Haml 中编写 if 条件?

    怎么写if and if elseRuby on Rails 应用程序的 Haml 语句 HAML 是基于缩进的 解析器可能很棘手 在 Haml 中不需要使用 end 请改用缩进 在 Haml 中 只要在 Ruby 计算命令之后增加缩进 就
  • Rails 验证日期范围的唯一性

    我有一个涉及员工缺勤记录的应用程序 我需要确保每条记录的开始日期和结束日期不重叠 例如 如果我输入了从今天开始到明天结束的缺勤记录 则不可能以任何方式在该日期范围内输入另一个缺勤记录 所以我不能制作一个从前天开始 然后在后天或任何更晚的日期
  • 在 debian Squeeze 上安装 RoR

    有什么方法可以在我的 debian squeeze 上安装 Ruby 1 9 2 或 1 8 7 Rails 3 吗 您可能不想在生产计算机上使用 RVM 它的 PATH 魔力会在不明显的地方 例如 cron 作业 被破坏 然后你就会陷入困
  • 如何跳过 Devise SessionsController 的 before_filter ?

    我有一个before filter in my ApplicationController 也就是说 对于我的项目中的每个控制器 我怎么能够skip before filter对于设计的SessionsController创造行动 这是我的
  • Ruby on Rails 最酷的功能是什么,为什么选择它? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在我问这个问题之前 我浏览了 SO 上 Ruby on Rails 的搜索结果 找不到太多 但以下 在此页面上找到 https stackove
  • 错误“未初始化常量 AWS (NameError)”

    它说 AWS 未初始化 我正在使用 aws sdk core gem 我尝试使用 aws sdk gem 代替 问题仍然存在 这是initializers aws rb 文件 AWS config access key id gt ENV
  • 设备注册控制器获取零资源的自定义操作

    基本上我想要有两个单独的操作来更改密码和更改电子邮件 而不是只有一个 我已经更新了我的路由以指向继承自 Devise RegistrationsController 的新控制器 我的路线 rb devise for users contro
  • Twitter Bootstrap 中下拉链接的模态

    我正在尝试从下拉菜单中的链接进行模式启动 该模式似乎已启动 网站变为灰色 但看不到 来自不在下拉列表中的常规链接的模态工作得很好 我对 jquery 进行了愚弄 但由于我是 jquery 的新手 所以没有任何结果 这是我的网站代码
  • Ruby on Rails 3 - 为每个请求重新加载 lib 目录

    我正在为 Rails 3 应用程序创建一个新引擎 正如您所猜测的 该引擎位于我的应用程序的 lib 目录中 但是 我在开发它时遇到了一些问题 事实上 每次更改引擎中的某些内容时 我都需要重新启动服务器 有办法避免这种情况吗 我可以强制rai
  • save_and_open_page 已停止提供我的 CSS

    我的测试设置工作得很好 每当我打电话时 都能提供正确格式的 css 页面save and open page从测试中 然后 我设置了一些 javascript 测试 并对我的设置进行了一些更改 抱歉 我无法详细说明所有内容 我没有足够详细地
  • Rails Capistrano 3 - 如何将 production.log 文件共享到 Capistrano 的共享文件夹中?

    我正在使用 Capistrano 3 与我的 Rails 应用程序一起部署 问题是 每次我将应用程序部署到服务器时 log development log 文件都会重置 我听说可以将 production log 文件放入共享文件夹中并在每
  • 回滚后是否应该删除迁移

    我对 ruby 和 Rails 相当陌生 刚刚开始了解迁移 我的问题是回滚后删除迁移的最佳实践或正确时间是什么 到目前为止 我读到的内容是回滚后是否删除迁移的观点问题 但是在团队中工作时删除迁移是否有任何重大影响 以及保留迁移文件相对于删除
  • 在 ActiveAdmin 或打印解决方案中动态更改分页

    我是 Activeadmin 和 Rails 的新手 我需要一些帮助 我有一个分页模型 我想允许用户更改分页值或完全禁用它 这样它就可以打印 到打印机 所有记录 或过滤后的记录 我知道我可以在 before filter 中使用 per p

随机推荐

  • 基准 C++ 与 Java,结果不切实际

    我做了一个简单的测试 我知道 C 更快 但我的测试结果不切实际 C 代码是 include
  • 如何在 JavaFX TextField 中设置对齐方式?

    我需要将 TextField 中的文本设置为右对齐 TextField下没有这个 有人知道如何在 javaFX 2 0 中的文本字段中设置对齐方式吗 Thanks 在 JavaFX 2 0 中 这可能是不可能的 但它is在 JavaFX 2
  • Django IntegrityError 电子邮件不是唯一的

    我正在与普通 来宾用户一起处理我的结帐视图 但很难解决完整性错误 想法是让访客用户仅使用电子邮件注册才能结帐 我需要将用户电子邮件设置为唯一 模型 py from django conf import settings from djang
  • 如何使用 Gnuplot 生成绘图,其中每行的第 1 列用作键?

    我目前有 set terminal png set datafile separator set style data linespoints set key plot data forplotting population csv usi
  • 核心数据最大实体数量

    我正在开发一个使用核心数据的应用程序 我已经尝试过对一个实体执行此操作 但没有成功 但我现在有大约二十个实体 我的问题是 实体数量或推荐数量是否有限制 有没有更好的方法来存储这么多数据 UPDATE 我存储的是学校的毕业生 但不是 A b
  • vtkOBJReader 将 OBJ 作为单独的 vtkPolyData 对象导入

    我的目的是获得 vtkPolyData 通过 vtk OBJ 导入实现理想的颜色 纹理 传递给 k3d 查看器使用 k3d vtk poly data
  • 如何将单维索引转换为多维数组中的相应索引?

    假设我有一个 3x4x5x6 java 双精度数组a我展开到 ArrayList 中b长度为 360 的方式如下 for int i 0 i
  • C#:将 DataTable 绑定到 GridView 时更改列的顺序

    如何更改数据表中列的显示顺序 例如 数据表 dt 包含两列 a 和 b 我将它绑定到 GridView 如下所示 gridView DataSource dt gridView DataBind 但我希望 GridView 首先显示 b 最
  • 如何加速 VBA 宏

    我正在使用宏生成新工作表 对于新工作表生成 数据是从 4 个以上的 MS Access DB 中检索的 每个 DB 至少有 200 个字段 我的宏代码包括 1 Cell locking 2 Alignment and formatting
  • 如何在 Xamarin Forms(Android 和 iOS)中实现 Google 地图? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我有一个 Google 地图 API 密钥 我想用它来使用 Xamarin Forms 在我的 Android 应用程序和 iOS 应用程序中显示地图 您会使用哪个库来减少两个操
  • 检查样式配置中的 IntelliJ IDEA 代码格式

    我决定为 android maven 插件做出贡献 他们使用非常特定的代码风格格式 我需要一些时间来修改IDEA代码格式规则以满足他们的要求 幸运的是有 checkstyle 配置 我已经为 IDEA 安装了检查式插件 并立即看到我当前的格
  • 如何删除 psql(PostgreSQL 交互式终端)中以常用单词开头的所有表?

    如何删除名称开头的所有表 例如doors 我可以使用某种正则表达式吗drop table命令 我不喜欢编写自定义脚本 但欢迎所有解决方案 谢谢 该脚本将生成 DDL 命令来删除它们 SELECT DROP TABLE t oid regcl
  • 在圆形数组中搜索

    在圆形数组中搜索的最佳方法是什么 Example 1 array 45 67 44 11 49 4 56 12 39 90 circular array 11 49 4 56 12 39 90 45 67 二分搜索是正确的开始方法吗 二分查
  • IntelliJ IDEA 仅运行突出显示的代码

    如何仅在 IntelliJ IDEA 中运行突出显示的代码 有时您不需要运行整个文件 而只想运行某些数量的代码 IntelliJ IDEA中有这样的选择吗 有可能计算任意表达式 Run Evaluate Expression 要评估代码片段
  • 表格大小与页面布局

    我在 Oracle Linux Server 6 3 版上使用 PostgreSQL 9 2 根据存储布局文档 页面布局包含 页头数据 24 字节 n 项 索引项 表项 的点数 AKA ItemIdData 4 字节 可用空间 n 个项目
  • Java - PaintComponent 中的 MouseListener 操作事件

    这里我有一个代码 它使用paintComponent在鼠标单击的位置上绘制一个矩形 我可以获得输出消息 但与图形和 draw 相关的任何内容都不起作用 Code import java awt import java awt event i
  • 仅解码 URL 非 ascii 字符

    现在我正在研究维基百科 在很多文章中 我注意到一些网址 例如 https www google com search q 26 E0 B8 89 E0 B8 B1 E0 B8 99 都很长 示例 URL 可以替换为 https www go
  • WPF UserControl 不继承父 DataContext

    我正在尝试开发一个可重用的用户控件 但遇到了绑定问题 我创建了一个较小的应用程序来测试它 但无法解决它 或者至少无法理解为什么它没有按照我的预期工作 代码如下 我期望的是我放在 MainWindow xaml 上的 TestUserCont
  • 转换颜色以模仿灰度打印

    读书时这个问题 我开始思考是否可以转换颜色来模仿普通的灰度打印机 假设您的屏幕已校准 找到一个可认可的近似值可以节省纸张 例如 如何转换这些颜色 看看在纸上是否可以区分浅蓝色和深蓝色和红色 temp lt rgb2hsv 239 138 9
  • 使用accepts_nested_attributes_for创建新记录或更新现有记录

    阅读重大更新以获取最新信息 嘿大家 我在 Rails 应用程序中有一个多对多关系 涉及三个表 用户表 兴趣表和连接 user interests 表 该表也有一个评级值 以便用户可以对他们的每个兴趣进行评级1 10 级 我基本上是在寻找一种