accepts_nested_attributes_for has_many:通过创建和删除连接模型对象,具体取决于其他模型

时间:2017-04-04 17:34:29

标签: ruby-on-rails ruby ruby-on-rails-5 nested-forms has-many-through

以下是我的模特

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 %>

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

我尝试制作一个虚拟属性 - UserRole的电子邮件,该电子邮件是用户实际电子邮件属性的链接,但失败了。

整个情况看起来好像我正在使用错误的方法解决这个问题。请,建议。

1 个答案:

答案 0 :(得分:0)

首先,我不认为你可以在UserRoles中拥有accept_nested_attributes:user,因为UserRole是嵌套在User中的内容,而不是相反的方式。根据您所描述的内容,您似乎无论如何都不需要,除非您的业务逻辑中存在其他情况,除了此表单。

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

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

但是,用户电子邮件逻辑可能必须被提取到其他内容中。如果我是你,我会在电子邮件输入字段中创建一个ajax调用。该调用将电子邮件发送到服务器,服务器将尝试查找任何匹配的用户,如果找到一些,它将返回他们的id-email对。然后在下拉列表中将返回的数据(电子邮件)显示为选择选项。当用户单击已提取的有效电子邮件时,表单将id设置为该字段的值(user_roles中的user_id字段)。如果没有找到用户,则返回一个字符串,表明该电子邮件中没有找到用户。

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