Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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 3有很多:通过记录保存错误_Ruby On Rails_Ruby On Rails 3_Has Many Through - Fatal编程技术网

Ruby on rails rails 3有很多:通过记录保存错误

Ruby on rails rails 3有很多:通过记录保存错误,ruby-on-rails,ruby-on-rails-3,has-many-through,Ruby On Rails,Ruby On Rails 3,Has Many Through,我不确定我的问题是什么,所以这个问题可能需要进一步澄清,但以下是最相关的问题: 我有一个有很多:通过,连接模型有一些字段不是外键。当我构建模型并尝试保存时,我在连接模型的非外键字段上得到一个验证错误 我的文件看起来像: Person.rb has_many :wedding_assignments, :dependent => :destroy has_many :weddings, :through=>:wedding_assignments accepts_nest

我不确定我的问题是什么,所以这个问题可能需要进一步澄清,但以下是最相关的问题:

我有一个
有很多:通过
,连接模型有一些字段不是外键。当我构建模型并尝试保存时,我在连接模型的非外键字段上得到一个验证错误

我的文件看起来像:

Person.rb

  has_many :wedding_assignments, :dependent => :destroy
  has_many :weddings, :through=>:wedding_assignments
  accepts_nested_attributes_for :weddings
  accepts_nested_attributes_for :wedding_assignments

Wedding.rb

  has_many :wedding_assignments, :dependent => :destroy
  has_many :people, :through=>:wedding_assignments
  accepts_nested_attributes_for :people
  accepts_nested_attributes_for :wedding_assignments

WeddingAssignment.rb

  belongs_to :person
  belongs_to :wedding
  validates_presence_of :role, :person, :wedding
{"first_name"=>"", "last_name"=>"", "weddings_attributes"=>{"0"=>{"wedding_assignments_attributes"=>{"0"=>{"role"=>"Bride's Maid", "budget"=>""}}, "date"=>"", "ceremony_notes"=>""}}}
(角色是一个字符串)

返回的参数如下所示:

Person.rb

  has_many :wedding_assignments, :dependent => :destroy
  has_many :weddings, :through=>:wedding_assignments
  accepts_nested_attributes_for :weddings
  accepts_nested_attributes_for :wedding_assignments

Wedding.rb

  has_many :wedding_assignments, :dependent => :destroy
  has_many :people, :through=>:wedding_assignments
  accepts_nested_attributes_for :people
  accepts_nested_attributes_for :wedding_assignments

WeddingAssignment.rb

  belongs_to :person
  belongs_to :wedding
  validates_presence_of :role, :person, :wedding
{"first_name"=>"", "last_name"=>"", "weddings_attributes"=>{"0"=>{"wedding_assignments_attributes"=>{"0"=>{"role"=>"Bride's Maid", "budget"=>""}}, "date"=>"", "ceremony_notes"=>""}}}
准确的误差是:

ActiveRecord::RecordInvalid in PeopleController#create
Validation failed: Role can't be blank
这显然是不正确的,因为您可以在
params[]中看到它

我做错了什么


这是rails 3.0.0

请尝试将“Person.new”更改为“Person.create”,也许立即在db中创建记录将有助于关联。

对,这只是一个猜测,如果我在这里浪费您的时间,请道歉

在我看来,在你的创建方法中,你正在创建“婚礼”关系(实际上这只是一个“假装”关系,它使用:through=>:wedding_赋值),然后返回这个。然后,在对Person.new的调用中要求rails重新创建这些对象。我的猜测是,rails试图在has\u many:through的远端创建一个对象,而中间对象不存在,这会让rails感到困惑

我很想对它进行一些重构(未经测试的代码!):

我有一种感觉,这会一直持续到最后一行。我怀疑要使其发挥作用,您可能需要使用事务:

def create
  @person = Person.new(params[:person])
  @wedding = Wedding.new(params[:person])
  ActiveRecord::Base.transaction do
    if @person.valid? && @wedding.valid?
      [@person,@wedding].each.save!
      @assignment = WeddingAssignment.new(params[:wedding_assignment].merge({:person => @person}))
      @assignment.save!
    end
  end
end
这应该确保一切都以正确的顺序创建,ID在正确的时间可用等。不幸的是,这比您的示例要复杂一些,这确实意味着您将难以支持多个婚礼


希望这会有所帮助,而不会成为一条死胡同。

我很好奇那些
1.次的
?我这样做是为了方便以后更改为2.次或更多。你是对的,这样做甚至可以让用户选择一次添加10个婚礼DYour error在create_with_appointment方法上表示错误,但在控制器输出上不存在该错误。这是什么方法?您是否尝试过在
create
方法中显式设置
role
属性的值?您甚至可以通过临时删除
角色
属性上的验证条件来检查这是否有效。我绝对不希望它们立即出现在数据库中。如果用户改变主意并离开页面,会发生什么?如果我使用“create”,我不会有一个空记录吗?到目前为止,这是最好的答案。这样做意味着我将无法干净地生成表单字段(如:)。Rails应该能够管理这些关联。在周末,我重新编写了构建和运行的代码,从连接模型WeddingAssignment开始,而不是Person,它工作得很好。因此,我认为您对rails“感到困惑”的看法是正确的。我有一个类似的问题,我正试图通过这个问题来解决,但我在个人身上发现了一个大规模的分配安全错误。有什么想法吗?