accepts_nested_attributes_for has_many :通过创建和删除连接模型对象,依赖其他模型

accepts_nested_attributes_for has_many :through Create and delete join model objects, depending on other model

这是我的模型

class User < ApplicationRecord
    has_many :user_roles, dependent: :destroy
    has_many :projects, through: :user_roles
    has_secure_password
end

class UserRole < ApplicationRecord
    belongs_to :user
    belongs_to :project
    accepts_nested_attributes_for :user
end

class Project < ApplicationRecord
    has_many :user_roles, dependent: :destroy
    has_many :users, through: :user_roles
    accepts_nested_attributes_for :user_roles
end

目前我正在尝试找到一种在项目创建表单中创建多个 UserRole 条目的正确方法。

UserRole 存储 user_id、project_id 和角色。
实际问题:UserRole 的表单输入是用户的电子邮件,即我应该找到具有此类电子邮件的用户,如果存在此类用户,则检索他的 ID 并将其保存在 UserRole.user_id.

它在控制台中运行良好,但不适用于表单。 我尝试在表单

中使用 accepts_nested_attributes_for 和嵌套字段
 <%= form_for @project do |f| %>
      # project fields
      <%= f.fields_for :user_roles do |role_f| %>
          # user role fields
          <%= role_f.fields_for :user do |user_f| %>
               # user fields
           <% end %>
       <% end %>
 <% end %>

使用此表单我可以轻松修改任何条目。但无法正确添加或删除。此外,此表单允许修改用户,这很麻烦。 我正在寻找一种方法来仅创建和删除项目的用户角色,同时保证用户安全。

我试图创建一个虚拟属性 - UserRole 的电子邮件,这将是 link 到用户的实际电子邮件属性,但失败了。

整个情况看起来好像我对这个问题使用了错误的方法。求指教

首先,我认为您不能在 UserRoles 中为 :user 使用 accepts_nested_attributes,因为 UserRole 是嵌套在 User 中的,而不是相反。从你所描述的情况来看,你似乎并不需要它,除非你的业务逻辑中有其他情况,除了这种形式。

我强烈建议您在嵌套表单上观看此 railscast。它显示了一种动态添加和删除嵌套字段的方法(添加或删除 UserRole 字段集)

http://railscasts.com/episodes/197-nested-model-form-part-2?autoplay=true

然而,用户电子邮件逻辑可能必须提取到其他东西中。如果我是你,我会在电子邮件输入字段中创建一个 ajax 调用。该调用会将电子邮件发送到服务器,服务器将尝试找到任何匹配的用户,如果找到一些用户,它将 return 他们的 id-email 对。然后,您将 returned 数据(电子邮件)显示为下拉列表中的 select 选项。当用户单击已获取的有效电子邮件时,表单将 id 设置为该字段的值(user_id 字段 inside user_roles)。如果没有找到用户,你 return 一个字符串,表示没有找到用户使用该电子邮件或类似的东西。

如果您不想获取 ID,则必须从控制器中的参数哈希中提取电子邮件。对于每封电子邮件,尝试找到一个用户,然后您必须找到一种方法来分别管理每个电子邮件的错误,以防找不到用户。第一个选项肯定会提供更好的用户体验。