9

我正在尝试实现nested_attributes 并创建一个时间表正在工作。但它在编辑时失败而没有给出任何错误。它适用于一对一关系,但不适用于一对多。我正在传递此文档中所述的时间表 ID:NestedAttributes

我有这些模型:

class Article < ActiveRecord::Base
  has_many :schedules

  accepts_nested_attributes_for :schedules
end

class Schedule < ActiveRecord::Base
  belongs_to :article
end

这是用于将强参数列入白名单的控制器片段:

def article_params
  params.require(:article).permit(schedules_attributes: [ :id, :schedule_for, :content, :time_zone, :date, :time ])
end

这是我通过 rails 控制台尝试的示例:

article_params = {"schedules_attributes"=>{"0"=>{"schedule_for"=>"pre", "content"=>"This is a scheduled message for ETS - !!!!!!!", "time_zone"=>"American Samoa", "date"=>"2013-10-20", "time"=>"11:15 AM", "id"=>"1"}}}

article = Article.find(1)

article.update(article_params)

D, [2013-10-25T16:42:50.266517 #2296] DEBUG -- :    (0.1ms)  BEGIN
D, [2013-10-25T16:42:50.267789 #2296] DEBUG -- :   Schedule Load (0.3ms)  SELECT "schedules".* FROM "schedules" WHERE "schedules"."article_id" = $1 AND "schedules"."id" IN (1)  [["article_id", 1]]
D, [2013-10-25T16:42:50.273288 #2296] DEBUG -- :    (0.3ms)  COMMIT

它选择了正确的时间表,但没有进行更新查询,也没有任何错误。我在这里错过了什么吗?

编辑:

我正在使用 Ruby 2.0 和 Rails 4。

4

6 回答 6

0

尝试这个:

Rails 控制台

 a = Article.find(1) 
 b = a.schedules.first
 article_params = {"schedules_attributes"=>{"0"=>{"schedule_for"=>"pre", "content"=>"This is a     scheduled message for ETS - !!!!!!!", "time_zone"=>"American Samoa", "date"=>"2013-10-20", "time"=>"11:15 AM", "id"=>"1"}}}

 b.update(article_params)
 b.save

您可能还想编辑文章参数以使其成为一个简单的对象。

于 2014-11-24T13:53:19.377 回答
0

请查看inverse_of文档中与您的问题相关的选项

在模型中使用它:

class Article < ActiveRecord::Base
  has_many :schedules, inverse_of: :article

  accepts_nested_attributes_for :schedules
end

class Schedule < ActiveRecord::Base
  belongs_to :article, inverse_of: :schedules
end
于 2013-11-18T11:48:27.533 回答
0

请参阅此 PRO railscasts 以了解嵌套关联...其伟大的RAILSCASTS PRO 插曲用于嵌套关联

于 2014-06-10T10:34:45.430 回答
0

我认为这里的问题与您如何测试它有关。如果您查看“一对多”下的文档( http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html ),您将看到以下示例,说明如何使用嵌套关联进行反对创建:

params = { member: {
  name: 'joe', posts_attributes: [
    { title: 'Kari, the awesome Ruby documentation browser!' },
    { title: 'The egalitarian assumption of the modern citizen' },
    { title: '', _destroy: '1' } # this will be ignored
  ]
}}

member = Member.create(params[:member])

您发布的示例没有传递schedules_attributesas a Array,而是传递 a Hash,这似乎不是正确的用法。尽管此示例适用于ActiveRecord::Base.create,但同样适用于ActiveRecord::Base#update_attributes

于 2014-03-17T21:12:30.387 回答
0

这里的问题似乎是您没有accepts_nested_attributes_for正确使用强参数。

你能试一下吗

模型

accepts_nested_attributes_for :schedules

控制器文件

def article_params
    params.require(:article).permit(:my, :attributes, :schedules: [:schedule, :whitelist])
end

@article.update_attributes!(article_params)

对我来说,rails 需要强大的参数并accepts_nested_attributes_for以这种方式工作,这对我来说是愚蠢的,但也许我错过了一些东西。

也尝试使用.update_attributes!with a !,这将告诉 rails 引发错误,所以你知道发生了什么。

你有article[schedules_attributes][0][schedule_for]你的,我对此不是 100% 肯定,但我相信这将作为 params[:article][:schedules_attributes_0][schedule_for] 发送

你能试着把article[schedule_attributes][][attribute_name]

于 2013-10-26T05:38:56.600 回答
0

这里有一些想法给你:

def article_params
  schedules_attributes: [ :id, :schedule_for, :content, :time_zone, :date, :time ]
end

应该:

def article_params
    params.require(:article).permit(schedules_attributes: [ :id, :schedule_for, :content, :time_zone, :date, :time ])
end
于 2013-10-26T13:01:35.517 回答