【发布时间】:2017-09-26 09:53:11
【问题描述】:
以下是我的模型结构
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未创建,因此必须有某种错误消息或未创建它的原因。包括你的控制器代码,包括@company.errors.full_messages的输出和检查你的参数是如何显示的。也许user_role不是saving,因为它无效。user_role有一个belongs_to :user和一个belongs_to :role, optional: true。将跳过验证role是否存在,但您需要有一个有效的user。如果你给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]) -
user_role belongs_to user。user_role.user_id必须对应于现有user的id。users中一行的字段id。如果您尝试保存user_role而user尚未保存,您将触发验证错误并且user_role将不会被保存。在创建user_role之前保存user -
您的
db结构错误。user has_one :role和role has_many :users。您只需在创建用户时设置user.role_id字段。无需创建对象,您可以在seed.rb文件中创建标准roles,如果需要,您可以提供单独创建roles的功能。当您创建user时,您只需设置他将拥有的角色,而不是创建对象。 guides.rubyonrails.org/association_basics.html -
@wish 检查我的解决方案。它应该适合你。它经过测试。
标签: ruby-on-rails associations ruby-on-rails-5 nested-form-for