[英]How do I update two models with one form in Ruby on Rails?
我有兩個模型,Page和PageContent。
class Page < ActiveRecord::Base
has_many :page_contents
end
class PageContent < ActiveRecord::Base
belongs_to :page
end
頁面有一個:css_design屬性,但我希望能夠從我的PageContent表單中編輯該屬性。 有任何想法嗎?
我看到很多accepts_nested_attributes和fields_for建議,但是它們不起作用 ,因為它們似乎都是用於A的表單。從表單創建不同模型的全新實例(例如,從項目創建任務)形式),或B.通過父級更新相關記錄。 我想做相反的事情 - 我想通過相關記錄更新父記錄。
任何幫助是極大的贊賞! 提前謝謝了!
- 標記
UPDATE
我已將以下內容添加到我的PageContent模型中:
def css_design
page ? page.css_design : nil
end
def css_design= (val)
if page
page.update_attribute 'css_design', val
else
@css_design = val
end
end
after_create :set_page_css_design_on_create
def set_page_css_design_on_create
self.css_design = @css_design if page && @css_design
end
我在創建和更新操作中都有:
@page_content.update_attributes params[:page_content]
但是我得到了:
NoMethodError (undefined method `css_design=' for #<Page:0x00000003a80338>):
app/models/page_content.rb:13:in `css_design='
app/controllers/page_contents_controller.rb:56:in `new'
app/controllers/page_contents_controller.rb:56:in `create'
當我第一次創建page_content時。 我直接從我的文件中復制並粘貼了這些東西,所以如果你看到任何奇怪的東西,請告訴我!
如果字段不是太多,您可以通過attr_accessor向PageContent模型添加屬性。 然后更新父After_save。 像這樣的東西:
class PageContent < ActiveRecord::Base
belongs_to :page
attr_accessor :css_design
after_save :update_parent_css
private
def update_parent_css
self.page.update_attribute(:css_design, self.css_design)
end
end
然后,您可以為其添加表單字段,就像任何其他PageContent字段一樣。 如果它不止一個字段,請使用update_attributes。 此外,您可能希望確保設置屬性(使用attribute_present?(attribute)),因此它不會用nil覆蓋它。
(對不起,我沒時間馬上測試一下。我會稍后再試。)
使用以下內容更新您的模型:
class PageContent < ActiveRecord::Base
belongs_to :page
def css_design
page ? page.css_design : nil
end
def css_design= (val)
if page
page.update_attribute 'css_design', val
else
@css_design = val
end
end
after_create :set_page_css_design_on_create
def set_page_css_design_on_create
self.css_design = @css_design if page && @css_design
end
end
您的表單現在可以顯示和更新當前頁面的值,即使它看起來只是處理PageContent:
<%= form_for @page_content do |f| %>
...
<%= f.text_field :css_design %>
...
<% end %>
在您的控制器中,例如:
def update
...
@page_content.update_attributes params[:page_content]
...
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.