0

这里是我的模型accepts_nested_attributes_for的has_many:通过创建和删除加入模型对象,这取决于其他型号

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和role。
实际的问题: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的电子邮件,它将链接到用户的实际电子邮件属性,但失败。

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

+0

忘了添加:Rails 5.0.2版,Ruby ruby​​ 2.3.1p112 –

回答

0

首先我不认为你可以在UserRoles中使用:accept_nested_attributes,因为UserRole是嵌套在User中而不是其他方式。然而,从你所描述的情况看,尽管如此,除了这种形式之外,除了业务逻辑中还存在其他情况之外,您似乎并不需要这样做。

我强烈建议你看看嵌套窗体上的这个railscast。它显示了一种动态添加和删除嵌套字段(添加或删除的UserRole组字段)

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

但是用户电子邮件逻辑将可能要被提取成别的东西。如果我是你,我会在电子邮件输入字段中创建一个ajax调用。该电话会将电子邮件发送到服务器,服务器将尝试查找任何匹配的用户,如果发现它会返回其id-email对。然后在下拉菜单中将返回的数据(电子邮件)显示为选择选项。当用户点击获取的有效电子邮件时,表单将该ID设置为该字段的值(user_roles中的user_id字段)。如果没有用户被发现,你会返回一个字符串,表示没有用户发现该电子邮件或类似的东西。

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

+0

感谢您的回答。看了视频并试图在我的应用中模仿它,但由于用户电子邮件/ ID问题而失败。关于使用AJAX调用你是100%正确的。目前我正在研究此功能的简化版本(user_roles控制器和params散列)。在获得控制器解决方案正常工作后,肯定会尝试将其重构为AJAX调用。 –

相关问题