0

Voici ma structure modèleCréer un enregistrement à l'aide par l'association et les rails 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 

Je veux créer enregistrement en utilisant association et emboîtées et maintenant je suis en mesure de créer la société avec l'utilisateur en utilisant imbriqué formulaire, mais je veux aussi créer user_role pour l'utilisateur.

J'ai inclus accepts_nested_attributes_for :users dans le modèle de l'entreprise. et utilisé fields_for pour créer l'utilisateur dans le nouveau formulaire de l'entreprise.

Ce qui suit est ma forme

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

En ce moment, le user_role n'est pas créé lors de la création de l'entreprise. Je ne suis pas sûr de savoir comment procéder.

Toutes les indications seront appréciées. Merci d'avance.

+0

'user_role' n'est pas créé, il doit y avoir une sorte de message d'erreur ou la raison pour laquelle il ne se crée pas. Incluez votre code de contrôleur, incluez la sortie de '@ company.errors.full_messages' et vérifiez comment vos paramètres apparaissent. Peut-être que le 'user_role' n'est pas' save' car il n'est pas valide. 'user_role' a un' belongs_to: user' et un 'belongs_to: role, optionnel: true'. La validation de la présence de 'role' sera ignorée, mais vous devez avoir un' user' valide. Si vous donnez 'user_role' un' user_id' qui appartient à un utilisateur non enregistré, la validation échouera. –

+0

Merci pour la réponse rapide @Fabrizio, J'ai valider l'utilisateur. UserRole est la troisième table pour l'utilisateur et la société. Les champs pour user_role sont user_id, role_id et company_id. Il crée user_role avec user_id et company_id, mais n'inclut pas role_id dans l'enregistrement user_role. Veuillez regarder dans les paramètres forts 'params.require (: company) .permit (: nom,: site web,: téléphone,: description,: company_image, users_attributes: [: email,: prénom,: nom, téléphone,: string ,: date de naissance,: date_de_participation,: sexe,: mot de passe,: password_confirmation]) ' – wish

+0

'user_role belongs_to user'. 'user_role.user_id' doit correspondre à' l'id 'd'un 'user' existant. Le champ 'id' d'une ligne dans' users'. Si vous essayez d'enregistrer 'user_role' et que' user' n'a pas déjà été sauvegardé, vous déclenchez une erreur de validation et le 'user_role' ne sera pas sauvegardé. Enregistrez le 'user' avant de créer le' user_role' –

Répondre

0

Je veux créer enregistrement en utilisant association et emboîtées et maintenant je suis en mesure de créer la société avec utilisateur en utilisant emboîtées, mais je veux aussi créer user_role pour l'utilisateur.

Avant de créer un user_role vous devez vous engager et enregistrer la db votre user, sinon vous courrez dans une erreur de validation.

user_role n'est pas sauvé parce que le user_id vous définissez ne correspond pas à un sauvé user

user_role belongs_to utilisateur. user_role.user_id doit correspondre au id d'un user existant (champ id d'une ligne dans users). Si vous essayez d'enregistrer l'objet user_role et que le user n'a pas encore été enregistré, vous allez déclencher une erreur de validation et le user_role ne sera pas enregistré. Enregistrez le user dans votre contrôleur avant de créer le user_role.

+0

Vous avez bien essayé mais, comme je vous l'ai dit auparavant > Il crée user_role avec user_id et company_id, mais n'inclut pas role_id dans l'enregistrement user_role. Le problème n'est pas avec le problème d'objet d'utilisateur est d'enregistrer l'enregistrement complet. – wish

0

MODÈLES

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

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

Suivez ceci et cela devrait fonctionner pour vous