我正在尝试实现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 console :
的示例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。
答案 0 :(得分: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)
对我而言,轨道会依赖强大的参数和accepts_nested_attributes_for
以这种方式工作,这是愚蠢的,但也许我错过了一些东西。
同时尝试将.update_attributes!
与!
一起使用,这会告诉rails提出错误,因此您知道最新情况。
你有article[schedules_attributes][0][schedule_for]
,我不是100%肯定的,但我相信这将作为
PARAMS [:文章] [:schedules_attributes_0] [schedule_for]
您可以尝试放置article[schedule_attributes][][attribute_name]
答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分:0)
我认为这里的问题与你如何测试它有关。如果您查看&#34;一对多&#34;下的文档(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_attributes
作为Array
传递,而是传递为Hash
,这似乎不是正确的用法。虽然此示例适用于ActiveRecord::Base.create
,但同样适用于ActiveRecord::Base#update_attributes
。
答案 4 :(得分:0)
将此PRO视频广播引用为嵌套关联...其出色的RAILSCASTS PRO episode for nested association
答案 5 :(得分: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
您可能还想编辑文章参数,以使其成为一个简单的对象。