Ruby on rails Rails嵌套属性创建有许多通过关联的属性,但希望在其上设置更多数据
我将三个模型设置如下(为简洁起见,不完整): 而JSON:Ruby on rails Rails嵌套属性创建有许多通过关联的属性,但希望在其上设置更多数据,ruby-on-rails,Ruby On Rails,我将三个模型设置如下(为简洁起见,不完整): 而JSON: { "case": { "state": "CA", "clients_attributes": [ { "first_name": "John", "last_name": "Doe", "email": "johndoe@gmail.com" }
{
"case": {
"state": "CA",
"clients_attributes": [
{
"first_name": "John",
"last_name": "Doe",
"email": "johndoe@gmail.com"
}
]
}
}
将创建案例,并创建嵌套的客户端数组。Rails会自动为JSON数组中的每个客户机创建角色记录。但是,它仅设置case\u id
和client\u id
(将两者关联起来)。我还想在它创建的角色
模型上设置其他字段
如何做到这一点
编辑:
以下两个答案(2015年10月1日,太平洋标准时间下午12:50)均无效。使用这些答案的逻辑,客户机不能有多个角色(模型中需要并明确定义)
例如:
角色不能嵌套在案例内部--
上面的JSON将创建同一个客户机两次。名为“客户端1”的客户端有两个角色,一个角色类型为“类型1”,另一个角色类型为“类型2”。正如答案所建议的那样,上面的代码片段将创建两个客户端和两个角色。它应该创建一个客户端(因为它是同一个客户端,但该客户端有多个角色)。与其发布客户端属性,不如发布角色属性,以及每个角色所需的数据
roles\u属性中的每个role
都可以包含嵌套的client
对象
执行此操作时,保存引用现有客户端的新角色时可能会遇到问题。检查解决方案。不要发布客户端属性
,而是发布角色属性
,以及每个角色所需的数据
roles\u属性中的每个role
都可以包含嵌套的client
对象
执行此操作时,保存引用现有客户端的新角色时可能会遇到问题。检查解决方案。我以前能够做到这一点的唯一方法是根据需要定义各种模型的属性。不久前
你的方式比我的更简洁(也更好)。但是,您应该能够像我一样通过它传递所需的数据:
{
"case": {
"state": "CA",
"roles_attributes": [
"name": "Admin",
"client_attributes": [
{
"first_name": "John",
"last_name": "Doe",
"email": "johndoe@gmail.com"
}
]
]
}
}
如果您不想使用JSON,并且必须从HTML表单等中填充数据,则可以使用以下方法:
#app/controllers/cases_controller.rb
class CasesController < ApplicationController
def new
@case = Case.new
@case.roles.build.build_client
end
def create
@case = Case.new case_params
@case.save
end
private
def cases_params
params.require(:case).permit(:state, roles_attributes: [:name, clients_attributes:[:first_name, :last_name, :email])
end
end
我以前能够做到这一点的唯一方法是根据需要定义各种模型的属性。不久前
你的方式比我的更简洁(也更好)。但是,您应该能够像我一样通过它传递所需的数据:
{
"case": {
"state": "CA",
"roles_attributes": [
"name": "Admin",
"client_attributes": [
{
"first_name": "John",
"last_name": "Doe",
"email": "johndoe@gmail.com"
}
]
]
}
}
如果您不想使用JSON,并且必须从HTML表单等中填充数据,则可以使用以下方法:
#app/controllers/cases_controller.rb
class CasesController < ApplicationController
def new
@case = Case.new
@case.roles.build.build_client
end
def create
@case = Case.new case_params
@case.save
end
private
def cases_params
params.require(:case).permit(:state, roles_attributes: [:name, clients_attributes:[:first_name, :last_name, :email])
end
end
很荣幸,因为你提高了我的知识,谢谢:)这里有一个例子。Rails神奇地创建了case和客户端之间的关联,但我希望能够在它创建的关联上设置数据。如果我无法干预并执行此操作,那么我希望能够手动创建它们,并让它设置案例id和客户id,并指定更多我想要设置的字段。非常感谢,因为您提高了我的知识,谢谢:)以下是一个示例。Rails神奇地创建了case和客户端之间的关联,但我希望能够在它创建的关联上设置数据。如果我无法干预并执行此操作,那么我希望能够手动创建它们,并让它设置案例id和客户id,并指定更多要设置的字段。这将不起作用。原因是如果我这样做,一个客户端有两个角色,我在每个角色对象中指定该客户端,它将创建两次。我走了这条路,这行不通。原因是如果我这样做,一个客户端有两个角色,我在每个角色对象中指定该客户端,它将创建两次。我走了这条路,这行不通!阅读我对另一个答案的评论。你的JSON不起作用。阅读JSON,然后阅读模型关联。您可以在角色上指定客户端属性数组。一个角色只能属于一个客户端,不能属于多个客户端。尝试此操作只会抛出一个“未找到关联,您确定客户端在角色上吗?”之类的问题(因为关联是客户端,而不是客户端)。原因是它属于:client
,因此我无法传递数组,因此您的解决方案不起作用,JSON也不起作用。感谢您的坦诚:)我已经详细说明了我将如何处理它,如果它是错误的,我不希望您接受答案,我将把它作为一个讨论点或工作点,抱歉重复。我花了很多时间在这上面,已经走了这条路,还有其他的路都没有用。这是行不通的!阅读我对另一个答案的评论。你的JSON不起作用。阅读JSON,然后阅读模型关联。您可以在角色上指定客户端属性数组。一个角色只能属于一个客户端,不能属于多个客户端。尝试此操作只会抛出一个“未找到关联,您确定客户端在角色上吗?”之类的问题(因为关联是客户端,而不是客户端)。原因是它属于:client
,因此我无法传递数组,因此您的解决方案不起作用,JSON也不起作用。感谢您的坦诚:)我已经详细说明了我将如何处理它,如果它是错误的,我不希望您接受答案,我将把它作为一个讨论点或工作点,抱歉重复。我花了很多时间在这上面,已经走了这条路,还有其他的路,但仍然没有用。
#app/controllers/cases_controller.rb
class CasesController < ApplicationController
def new
@case = Case.new
@case.roles.build.build_client
end
def create
@case = Case.new case_params
@case.save
end
private
def cases_params
params.require(:case).permit(:state, roles_attributes: [:name, clients_attributes:[:first_name, :last_name, :email])
end
end
#app/models/role.rb
class Role < ActiveRecord::Base
belongs_to :client
belongs_to :case
accepts_nested_attributes_for :client
end
class Case < ActiveRecord::Base
has_many :roles
has_many :clients, through: :roles
accepts_nested_attributes_for :roles
end
#app/views/cases/new.html.erb
<%= form_for @case do |f| %>
<%= f.text_field :state %>
<%= f.fields_for :roles do |role| %>
<%= role.text_field :name %>
<%= role.fields_for :client do |client| %>
<%= client.text_field :first_name %>
<%= client.text_field :last_name %>
<%= client.email_field :email %>
<% end %>
<% end %>
<%= f.submit %>
<% end %>