创建记录使用通过联想和nested_form_for轨

问题描述:

以下是我的模型结构创建记录使用通过联想和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_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,可选:true'。角色的存在验证将被跳过,但您需要有一个有效的“用户”。如果您将'user_role'赋予属于未保存用户的'user_id',则验证将失败。 –

+0

感谢您的快速回复@Fabrizio, 我验证了用户。 UserRole是用户和公司的第三张表格。 user_role的字段是user_id,role_id和company_id。 它使用user_id和company_id创建user_role,但不包括role_id到user_role记录中。 请注意强参数 'params.require(:company).permit(:name,:website,:phone,:description,:company_image,users_attributes:[:email,:first_name,:last_name,:phone,:string ,:birth_date,:join_date,:gender,: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' –

我想创造纪录使用的关联和嵌套形式和现在的我能够与使用嵌套形式的用户一起创建公司,但我也想为用户USER_ROLE。

创建你需要提交并保存到您的db一个user之前user_role,否则你会碰到验证错误。

user_role不保存,因为user_id你设置不符合保存user

user_role belongs_to的用户。 user_role.user_id必须对应于现有的useridusers中的行的字段id)。如果您尝试保存user_role对象,并且user尚未保存,您将触发验证错误,并且不会保存user_role。在创建user_role之前,将user保存在您的控制器中。

+0

你做了很棒的尝试,但是,正如我之前告诉过你的那样 >它使用user_id和company_id创建user_role,但不包括role_id到user_role记录中。问题不在于用户对象的问题是保存完整的记录。 – wish

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

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

遵循这一点,它应该为你