0

次は私のモデル構造協会を通じて使用してレコードとnested_form_forレール

role.rb 

has_many :user_roles 
has_many :users, through: :user_roles 
has_many :companies, through: :user_roles 

user.rb 

has_one :user_role, dependent: :destroy 
has_one :role, through: :user_role 
has_one :company, through: :user_role 

company.rb 

has_many :user_roles, dependent: :destroy 
has_many :users, through: :user_roles 
has_many :roles, through: :user_roles 

user_role.rb 

belongs_to :user 
belongs_to :role, optional: true 
belongs_to :company 

である私が関連して、ネストされたフォームを使用してレコードを作成したいと今、私は、ネストされた使用して、ユーザーと一緒に会社を作成することができていますを作成します。私はUserのuser_roleも作成したいと思っています。

私はaccepts_nested_attributes_for :usersを社内モデルに含めました。 を入力し、fields_forを使用して新しい形式のユーザーを作成します。

次は、今の私のフォーム

<%= form_for @company, html: { multipart: true } do |f| %> 
    <% if company.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(company.errors.count, "error") %> prohibited this company from being saved:</h2> 

     <ul> 
     <% company.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field form-group"> 
    <%= f.label :name %> 
    <%= f.text_field :name, class: :"form-control" %> 
    </div> 

    <div class="field form-group"> 
    <%= f.label :website %> 
    <%= f.text_field :website, class: :"form-control" %> 
    </div> 

    <div class="field form-group"> 
    <%= f.label :phone %> 
    <%= f.text_field :phone, class: :"form-control" %> 
    </div> 

    <div class="field form-group"> 
    <%= f.label :description %> 
    <%= f.text_area :description, class: :"form-control" %> 
    </div> 

    <div class="field form-group"> 
    <%= f.file_field :company_image %> 
    </div> 

    <%= f.fields_for :users do |builder| %> 
    <%= render "users_fields", :f => builder %> 
    <% end %> 

    <div class="actions"> 
    <%= f.submit class: :'btn btn-default' %> 
    </div> 

<% end %> 

ある会社を作成するときに、USER_ROLEは作成されません。私はどのように進めるか分からない。

ご指摘いただければ幸いです。前もって感謝します。

+0

を動作するはずです 'user_role'は作成されていないので、エラーメッセージまたはそれが作成されていない理由のいくつかの並べ替えがなければなりません。あなたのコントローラコードを含め、 '@ company.errors.full_messages'の出力とあなたのパラメータがどのように表示されているかを確認します。おそらく、 'user_role'は有効ではないので' saving'ではないでしょう。 'user_role'は' belongs_to:user'と 'belongs_to:role、optional:true'を持ちます。 'role'の存在の検証はスキップされますが、有効な' user'が必要です。保存されていないユーザに属する 'user_role'、' user_id'を与えると、検証は失敗します。 –

+0

クイック返信ありがとう@Fabrizio、 私はユーザーを検証しています。 UserRoleは、ユーザーと企業にとって3番目のテーブルです。 user_roleのフィールドはuser_id、role_id、およびcompany_idです。 user_roleおよびuser_roleレコードにrole_idを含めずに、user_roleおよびcompany_idを使用してuser_roleを作成します。 params.require(:company).permit(:name、:website、:phone、:description、:company_image、users_attributes:[:電子メール、:first_name、:last_name、:phone、:string 、:birth_date、:join_date、:性別、:password、:password_confirmation]) ' – wish

+0

' user_role belongs_to user'です。 'user_role.user_id'は、既存の' user'の 'id'に対応していなければなりません。 'users'の行の' id'フィールドです。 'user_role'を保存しようとしたときに、' user'がまだ保存されていなければ、検証エラーが発生し、 'user_role'は保存されません。 'user_role'を作成する前に' user'を保存してください –

答えて

0

私は、協会とネストされたフォームを使用してレコードを作成したいと、今私は、ネストされたフォームを使用して、ユーザーと一緒に会社を作成することができるが、私はまた、ユーザーのUSER_ROLEを作成したいです。あなたがコミットしdbあなたuserに保存する必要がありuser_roleを作成する前に

は、そうしないと、検証エラーに実行されます。あなたが設定されている user_idは、ユーザーBELONGS_TO保存 user

user_roleに対応していないので、

user_roleは保存されません。 user_role.user_idは、既存のuseridusersの行のフィールドid)に対応する必要があります。 user_roleオブジェクトを保存しようとしたときにuserが保存されていないと、検証エラーが発生し、user_roleは保存されません。 user_roleを作成する前に、コントローラにuserを保存してください。

+0

>の前に私があなたに言ったように素晴らしい試みをしました。> user_roleとuser_roleレコードでuser_roleを作成しますが、role_idはuser_roleレコードに含めません。問題はユーザーオブジェクトの問題ではない完全なレコードを保存することです。 – wish

0

MODELS

1.company.rb

# put inverse_of otherwise it will throw error. To know more about inverse of go throw docs 
has_many :user_roles, inverse_of: :company 
has_many :users, through: :user_roles 
has_many :roles, through: :user_roles 

accepts_nested_attributes_for :user_roles 

2.user_role.rb

belongs_to :user 
belongs_to :role 
belongs_to :company 

# user_roles_attributes will accept nested attributes for both user and role 
accepts_nested_attributes_for :role 
accepts_nested_attributes_for :user 

3.user.rb

has_many :user_roles#, inverse_of: :user 
has_many :roles, through: :user_roles 
has_many :company, through: :user_roles 

4.role。RB

has_many :user_roles 
has_many :users, through: :user_roles 
has_many :companies, through: :user_roles 

Companycontroller.rb

def new 
    @company = Company.new 
    urole = @company.user_roles.build 
    urole.build_user 
    urole.build_role 
end 

def create 
    @company = Company.new(company_params) 
    @company.save 
end 

private 
def company_params 
    # here put associate modal attributes to permit. 
    params.require(:company).permit(:company_name, 
    user_roles_attributes: [ 
     role_attributes: [:role_name], 
     user_attributes: [:user_name, :email] 
    ] 
) 
end 

form.html.erb 210
<%= form_for @company, html: { multipart: true } do |f| %> 


    <%=f.fields_for :user_roles do |user_roles_builder| %> 

    --USER DETAILS-- 
    <br> 
    <%=user_roles_builder.fields_for :user do | user_builder | %> 
     <%= render "users_fields", :f => user_builder %> 
    <% end %> 
    <br> 


    -- ROLE DETAILS-- 
    <br> 
    <%=user_roles_builder.fields_for :role do | role_builder | %> 
     <%= render "users_fields", :f => role_builder %> 
    <% end %> 

    <% end %> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 

<% end %> 

はこれをフォローし、それはあなたのために