【问题标题】:Rails 5: Creating an object with a belongs_to association that belongs_to userRails 5:创建一个具有 belongs_to 关联的对象,该关联是 belongs_to 用户
【发布时间】:2016-07-23 18:49:49
【问题描述】:

在我的第一个 Rails 应用程序上工作,但我被卡住了。我自己很努力地解决了这个问题,但我似乎无法弄清楚。我无法创建一个属于_属于用户的对象的对象。

这些是模型关联结构:

class User < ApplicationRecord
  has_many :projects, dependent: :destroy

class Project < ApplicationRecord
  belongs_to :user
  has_many :docs, dependent: :destroy

class Doc < ApplicationRecord
  belongs_to :project

我想我需要以某种方式引用我正在尝试构建的文档所属的项目,但我被卡住了。如果我将 hidden_​​field_tag 添加到文档表单以传递 project_id,然后使用 docs 控制器中的参数将 @project 分配给该 project_id,这可行,但我知道有比发送 hidden_​​field_tag 更好的方法...

关于在这里研究什么或解决方案有什么想法吗?我觉得我错过了一些非常基本的东西!

【问题讨论】:

  • 我可以通过更改两件事来使代码工作:1,在我的工作表表单上添加一个 hidden_​​field_tag 以传递 project_id,以及 2,在我的工作表创建函数中添加此代码:@project = Project.find(params[:project_id]) 。但是,肯定有比 hidden_​​field 更好的方法,对吧?
  • 第二种方式是通常遵循的方式

标签: ruby-on-rails ruby-on-rails-5


【解决方案1】:

在您用于创建工作表的表单中(如果该页面可以访问 @project ,则可能是项目的 show.html.erb)

form_for([@project, @project.sheets.build]) do |f|
#rest of the code
end

如果表单无权访问@project,则 在表格控制器的新操作中

@project = Project.find(params[:project_id]) #using data from params hash
@sheet = @project.sheets.build

并在表单中创建工作表

form_for([@project, @sheet]) do |f|
end

在表单控制器的创建动作中

 @project = Project.find(params[:project_id])
 #rest of the code what you have

【讨论】:

  • 表单处于共享部分中,正在项目页面上呈现。更新 form_for 部分导致错误。通过 :project_id 查找项目返回错误:找不到没有 ID 的项目。但是,在向 create 函数添加一行代码时,添加一个 hidden_​​field_tag 以在表单上传递 project_id 是有效的。你能想出更好的方法吗?
  • 请发布您的项目页面,该页面呈现部分并形成部分工作表。这可能会有所帮助
【解决方案2】:

虽然可能有更标准的用例类型的答案,但以下对我有用。

我在 user 表中创建了一个新列来在 active_project 中存储一个整数来引用项目的 id。在制作文档时,我首先将@project 设置为id 为current_user.active_project 的项目,然后将文档创建为属于@project。

这可能有点倒退,但它有效,我可以使用 active_project 数据来允许用户重新访问他们上次打开的项目登录。感谢@pavan 的建议,他们让我走上了正确的道路! :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多