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調用。 –

相關問題