0

は私のモデル:を通じて作成し、モデルオブジェクトを結合を削除、他のモデルに応じて、ここで

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に保存する必要があります。

これはコンソールでうまく動作しますが、フォームではうまく動作しません。 は、私は簡単に任意の項目を変更することができます。このフォームでフォームに

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

をaccepts_nested_attributes_forとネストされたフィールドを使用しようとしました。しかし、追加や削除は正しくできません。また、このフォームは、ユーザーを変更することができ、それは面倒です。 私は、Userの安全を維持しながら、ProjectのUserRolesの作成と削除のみを行う方法を探しています。

ユーザーの実際の電子メール属性へのリンクになりますが、失敗したUserRoleの電子メールを作成しようとしました。

私はこの問題に間違ったアプローチをしているように見えます。ご意見をお聞かせください。

+0

忘れてしまった:Railsバージョン5.0.2、Ruby ruby​​ 2.3.1p112 –

答えて

0

まず、UserRoleがUserにネストされていて、それ以外の方法ではネストされていないため、accepts_nested_attributes for:UserRolesを持つことはできません。あなたが何を記述しているのかは、このフォームとは別に、ビジネスロジックに他のケースがある場合を除いて、とにかくそれを必要としないようです。

このレールスケートをネストした形で見ることを強くお勧めします。ユーザーの電子メール・ロジックは、おそらく何か他のものに抽出しなければならないであろうしかしそれは(フィールドののUserRoleセットを追加または削除)

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

を動的にネストされたフィールドを追加および削除する方法を示しています。私があなたの場合は、電子メール入力フィールドにajax呼び出しを作成します。その呼び出しは電子メールをサーバーに送信し、サーバーは一致するユーザーを見つけようとし、見つかった場合、IDと電子メールのペアを返します。次に、返されたデータ(電子メール)を選択オプションとしてドロップダウンに表示します。ユーザーが取り出された有効な電子メールをクリックすると、フォームはそのフィールドの値(user_roles内のuser_idフィールド)としてIDを設定します。ユーザーが見つからなかった場合は、その電子メールなどでユーザーが見つからなかったという文字列を返します。

IDを取得しない場合は、コントローラーのparamsハッシュから電子メールを抽出する必要があります。電子メールごとにユーザーを見つけようとすると、ユーザーが見つからなかった場合に備えて、それぞれのエラーを個別に管理する方法を見つける必要があります。最初のオプションは、より良いユーザーエクスペリエンスを確実に提供します。

+0

答えをありがとう。ビデオを見て、私のアプリでそれを模倣しようとしましたが、ユーザーの電子メール/ IDの問題のせいで失敗しました。あなたはAJAX呼び出しの使用について100%正しいです。現在、私はこの機能(user_rolesコントローラとparamsハッシュ)の簡略化されたバージョンに取り組んでいます。間違いなくAJAXコールにリファクタリングしようとすると、コントローラのソリューションが正しく動作するようになります。 –

関連する問題