Ruby on Rails:嵌套属性、belongs_to 关系

2023-11-26

我有一个具有当前位置字段(城市和国家/地区)的用户实体。为了保存这些信息,我创建了一个名为 Location 的实体,它有很多用户。

我不完全确定是否应该放入用户模型“has_one”或“belongs_to”,但根据我读到的内容,如果我希望它具有位置的外键,我应该放入“belongs_to”。我还希望能够在编辑用户时编辑用户的当前位置。所以我使用嵌套属性。但是,当我编辑用户时,我最终每次都会添加一个新位置,而不会将其与编辑的用户相关联。你能帮我吗?

我的代码如下:

#User Model
class User < ActiveRecord::Base
  ## Relationships
  belongs_to :current_location, :class_name => 'Location'
  accepts_nested_attributes_for :current_location
end

#Location Model
class Location < ActiveRecord::Base
  #Relationship
  has_many :users
end

# part of the _form_edit.haml
- form_edit.fields_for :current_location do |location_form|
  = location_form.label :location, "Current Location"
  = location_form.text_field :location

#Application Helper
#nested attributes for user and location
def setup_user(user)
  returning(user) do |u|
    u.build_current_location if u.current_location.nil?
  end
end

#in the user controller (added after edit)
def update
    @user = @current_user
    if @user.update_attributes(params[:user])
      flash[:notice] = "Account updated!"
      redirect_to account_url
    else
      render :action => :edit
    end
  end

正如其他人指出的那样,您面临的确切问题是您的控制器没有收到应有的位置 ID。在我看来,位置 ID 是通过错误的参数传递的。不幸的是,新记录中不存在位置 ID,因此在表单中这是不可能的。

您的问题源于对belongs_to关系使用accepts_nested_attributes_for。该行为没有明确定义。这似乎是一个已记录的错误。因此,accepts_nested_attributes_for 应该位于关系的一个或多个方面。

以下是一些可能的解决方案:

  1. 将 Accepts_nested_attributes_for 移至 Location 模型并以相反的方式构建表单。

    -form_for @location do |location_form|
     ...
     =location_form.fields_for @user do |user_form|
       ....
    

    不幸的是,这不允许以逻辑方式呈现信息。并且使得编辑正确的用户变得困难。

  2. 使用连接模型,并建立一个具有一:通过关系。

    老实说,我不确定 Accept_nested_attributes_for 与 :through 关系的配合效果如何,但它肯定会解决您链接记录的问题。

  3. 忽略 Accept_nested_attributes_for 并以老式方式处理控制器中的关联。

    实际上保留accepts_nested_attributes_for。它提供了一些方便的方法,只是不要让它到达 update_attributes/create 语句。

    def update 
      @user = @current_user 
      completed = false
      location_params = params[:user].delete(:current_location_attributes)
    
      User.transaction do
        @location = Location.find_or_create_by_id(location_params)
        @user.update_attributes(params[:user]) 
        @user.current_location = @location
        @user.save!
        completed = true
      end
      if completed
        flash[:notice] = "Account updated!" redirect_to account_url 
      else 
        render :action => :edit 
      end
    end
    

如果不创建新位置,则 的字段将自动填充 current_location_attributes 哈希中的 id 字段。但是,find_or_create_by_id 需要哈希中的 :id 条目才能工作。如果 id 不在数据库中,它将使用正确的自动递增 id 创建。如果您要创建新位置,则需要添加它。最简单的方法是将其添加到表单中=location_form.hidden_field :id, 0 unless current\_location.new\_record?.

但是,您可能希望减少重复的位置创建,并将 Location.find_or_create_by_id 行更改为 Location.find_or_create_by_location。这也将减少因唯一性验证失败而产生的任何错误。

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

Ruby on Rails:嵌套属性、belongs_to 关系 的相关文章

随机推荐

  • ExceptionContext.ExceptionHandled 更改为 true。异常在哪里处理?

    我正在使用全局操作过滤器来处理和记录所有异常 public static void RegisterGlobalFilters GlobalFilterCollection filters filters Add new ElmahHand
  • 在 ScrollView 中将文本对齐为前导 - SWIFTUI

    我有一个ScrollView ScrollView VStack alignment leading Text userData username userData age fontWeight semibold font Font sys
  • 安全处理 org.xml.sax.SAXNotRecognizedException 导致 Tomcat 内运行 java.lang.IllegalStateException 的解决方案

    我在接收 Xml 并尝试解析它时遇到此异常 负责此操作的代码在作为独立应用程序运行时经过了良好的测试 不过我现在正在将它集成到 Tomcat 中 堆栈跟踪是 java lang IllegalStateException org xml s
  • 如何使用 Python 和 matplotlib 绘制 4D 绘图

    我正在寻找一种使用 Python 和 matplotlib 创建四维图 曲面加色标 的方法 我能够使用前三个变量生成曲面 但我没有成功添加第四个变量的色标 下面是我的数据的一小部分 任何帮助将不胜感激 谢谢 数据子集 var1 var2 v
  • OpenCV 从字节数组创建 Mat

    在我的 C dll 中 我从字节数组创建 Mat BYTE ptrImageData Image data is in this array passed to this function Mat newImg Mat nImageHeig
  • 如何绑定命令以双击 DataGrid 中的行

    我开发了一个 WPF UserControl 旨在用作选择列表 如下所示 绑定到实体 例如员工 的 CollectionView 的 DataGrid DataGrid 上方的文本框 可用于过滤 DataGrid 中显示的项目 我想公开一个
  • Spark 数据集过滤器性能

    我一直在尝试不同的方法来过滤类型数据集 事实证明 性能可能会有很大不同 该数据集是基于 1 6 GB 行 33 列 4226047 行的数据创建的 DataSet 通过加载 csv 数据创建并映射到案例类 val df spark read
  • cakephp 查找列表

    您好 我希望能够使用 find 生成一个列表 以便我可以在选择帮助器中使用 但有一个问题 我也想获取 id 名称 第一个 最后一个 那么我怎样才能实现它呢 我希望将first name和last name作为name加入 我怎样才能实现它
  • AVD 的 SD 卡大小的合理值是多少? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我发现当我设置 AVD 时 并不真正知道我在做什么 只是按照在线教程或其他内容进行操作 我给 SD 卡的值是 100 MiB 这样的设置合理吗 我应该改用 8 GiB 之类的东西吗 还是这
  • 用于打开 URL 的 Google Apps 脚本

    有没有办法编写谷歌应用程序脚本 以便在运行时 第二个浏览器窗口打开 www google com 或我选择的另一个网站 我试图在这里想出一个解决我之前问题的方法 我可以在 Google Apps 电子表格的消息框中添加超链接吗 该函数打开一
  • jQuery 表单验证 - 错误标签的 CSS

    我使用与 jquery 网站上使用的完全相同的示例进行简单的表单验证 http docs jquery com Plugins Validation 但有一件事我不明白 示例中的错误消息显示在每个输入字段的右侧 我想在每个输入字段下显示错误
  • iOS 项目将 Xcode 4.2 更新到 Xcode 4.5

    在我的项目中 我已经使用 XCode 4 2 完成了 90 的开发 只需要支持 4 x 5 x 现在我还需要为 iOS 6 构建 所以我切换到 Xcode 4 5 和 iOS 6 但是我我面临很多问题 例如 Sqlite3 MobileCo
  • 摩卡与 NodeJS 断言断言挂起/超时(假)而不是错误

    我有这样的摩卡测试 describe sabah beforeEach sabahStrategy filter strats name sabah2 0 strat it article list should be populated
  • 我如何模拟 FromSql() 方法?

    我想知道除了构建一个包装器来嘲笑之外还有什么方法吗FromSql 我知道这个方法是静态的 但是因为他们添加了类似的东西AddEntityFrameworkInMemoryDatabase对于实体框架核心 我认为也可能有一个解决方案 我在我的
  • 在 ControlParameter“y”中找不到控件“x”

    我正在尝试使用列表视图的下拉列表来过滤结果 我已更改数据源的选择查询 如下所示 列表视图
  • 如何在仅标头模式下使用 fmt 库?

    很难使用 fmt 库的仅标头模式 这是我详细尝试过的 我从下载了fmt7 1 3https fmt dev latest index html 只放目录fmt 7 1 3 include fmt在目录中 trgdir 并编写了一个test
  • 如何阻止 URL.Action 包含参数?

    在我的主导航中 我有一个链接 Url Action Items FAQ 该链接工作正常 我可以 Item FAQ 但是 我有包含参数的链接 因此 Items FAQ Question 1 这一切都工作正常 但是 当我查看问题 1 这是一个视
  • 使用 ARKit 3.0 一次只能检测和跟踪最多 4 个图像

    使用下面的代码 在使用 ARKit 时 我只能同时检测和跟踪最多 4 个图像 ARImageTrackingConfiguration configuration ARImageTrackingConfiguration new confi
  • 如何添加到列表<?扩展 Number> 数据结构?

    我有一个声明如下的列表 List
  • Ruby on Rails:嵌套属性、belongs_to 关系

    我有一个具有当前位置字段 城市和国家 地区 的用户实体 为了保存这些信息 我创建了一个名为 Location 的实体 它有很多用户 我不完全确定是否应该放入用户模型 has one 或 belongs to 但根据我读到的内容 如果我希望它