Ruby on rails 通过关联和嵌套的表格为rails创建记录
下面是我的模型结构Ruby on rails 通过关联和嵌套的表格为rails创建记录,ruby-on-rails,associations,ruby-on-rails-5,nested-form-for,Ruby On Rails,Associations,Ruby On Rails 5,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 co
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
我想使用关联和嵌套表单创建记录,现在我可以使用嵌套表单与用户一起创建公司,但我还想为用户创建用户角色。
我已经在公司模型中包含了用户的接受\u嵌套的\u属性。
并使用
的字段创建公司新表单中的用户
以下是我的表格
<%= 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\u角色之前
您需要提交并保存到db
您的用户
,否则您将遇到验证错误
user\u role
未保存,因为您正在设置的user\u id
与已保存的user
用户角色属于用户<代码>用户角色。用户id
必须对应于现有用户的id
(用户中一行的字段id
)。如果您试图保存用户角色
对象,而用户
尚未保存,则会触发验证错误,并且不会保存用户角色
。在创建user\u角色之前,请在控制器中保存用户
型号
1.公司.rb
2.用户角色.rb
3.user.rb
4.角色.rb
公司控制器.rb
form.html.erb
--用户详细信息--
用户\u生成器%>
--角色详细信息--
角色\u生成器%>
遵循这一点,它应该适用于您未创建用户角色
,因此一定有某种错误消息或未创建该角色的原因。包括控制器代码,包括@company.errors.full_消息的输出以及检查参数的显示方式。可能user\u角色
无效,因此未保存
user\u角色
有一个属于:user
和一个属于:role,可选:true
。将跳过验证是否存在角色
,但您需要一个有效的用户
。如果您正在为该user\u角色
提供属于未保存用户的user\u id
,验证将失败。感谢@Fabrizio的快速回复,我已验证了该用户。UserRole是用户和公司的第三个表。用户\角色的字段为用户\ id、角色\ id和公司\ id。它使用用户\ id和公司\ id创建用户\角色,但不将角色\ id包括在用户\角色记录中。请查看强参数params.require(:company).permit(:name,:website,:phone,:description,:company\u image,users\u attributes:[:email,:first\u name,:last\u name,:phone,:string,:birth\u date,:join\u date,:gender,:password,:password\u confirmation])
用户角色属于用户
<代码>用户角色。用户id
必须与现有用户的id
相对应。users
中一行的字段id
。如果您试图保存用户角色
,而用户
尚未保存,则会触发验证错误,并且不会保存用户角色
。在创建user\u角色之前保存user
,您的db
结构错误<代码>用户有一个:角色
和角色有多个:用户
。创建用户时,只需设置user.role\u id
字段。无需创建对象,您可以在seed.rb
文件中创建标准角色
,如果需要,还可以提供单独创建角色的功能。当您创建用户
时,您只需设置他将拥有的角色,而不是创建对象@希望检查我的解决方案。它应该适合您。经过测试。您做了很好的尝试,但是,正如我之前告诉您的那样,它创建了具有用户id和公司id的用户角色,但没有将角色id包含到用户角色记录中。问题不在于用户对象,而在于保存完整的记录。
# 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
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
has_many :user_roles#, inverse_of: :user
has_many :roles, through: :user_roles
has_many :company, through: :user_roles
has_many :user_roles
has_many :users, through: :user_roles
has_many :companies, through: :user_roles
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_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 %>