Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 通过关联和嵌套的表格为rails创建记录_Ruby On Rails_Associations_Ruby On Rails 5_Nested Form For - Fatal编程技术网

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