Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.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 - Fatal编程技术网

Ruby on rails Rails嵌套属性创建有许多通过关联的属性,但希望在其上设置更多数据

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" }

我将三个模型设置如下(为简洁起见,不完整):

而JSON:

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