创建记录使用通过联想和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。我不知道如何继续。
任何指导将不胜感激。提前致谢。
我想创造纪录使用的关联和嵌套形式和现在的我能够与使用嵌套形式的用户一起创建公司,但我也想为用户USER_ROLE。
创建你需要提交并保存到您的db
一个user
之前user_role
,否则你会碰到验证错误。
user_role
不保存,因为user_id
你设置不符合保存user
user_role
belongs_to的用户。 user_role.user_id
必须对应于现有的user
的id
(users
中的行的字段id
)。如果您尝试保存user_role
对象,并且user
尚未保存,您将触发验证错误,并且不会保存user_role
。在创建user_role
之前,将user
保存在您的控制器中。
你做了很棒的尝试,但是,正如我之前告诉过你的那样 >它使用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 %>
遵循这一点,它应该为你
'不创建user_role',所以必须有某种错误消息或原因的,为什么不创建它。包括你的控制器代码,包括'@ company.errors.full_messages'的输出和检查你的参数如何显示。也许'user_role'不是'saving',因为它是无效的。 'user_role'有'belongs_to:user'和'belongs_to:role,可选:true'。角色的存在验证将被跳过,但您需要有一个有效的“用户”。如果您将'user_role'赋予属于未保存用户的'user_id',则验证将失败。 –
感谢您的快速回复@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
'user_role belongs_to user'。 'user_role.user_id'必须对应现有'user'的'id'。 'users'中一行的字段'id'。如果你试图保存'user_role'并且'user'还没有被保存,你将会触发一个验证错误,'user_role'将不会被保存。在创建'user_role'之前保存'user' –