2011-05-11 70 views
0

我有兩個模型,Page和PageContent。如何在Ruby on Rails中使用一種形式更新兩個模型?

class Page < ActiveRecord::Base 
    has_many :page_contents 
end 

class PageContent < ActiveRecord::Base 
    belongs_to :page 
end 

頁有:css_design屬性,但我希望能夠從我的PageContent形式編輯屬性。有任何想法嗎?

我看到了很多的accepts_nested_attributesfields_for的意見,但他們不工作,因爲他們都似乎是項目,是指A.創建從一個不同的模型的整個新實例的形式表單(例如,從項目表單創建任務),或者B.通過父項更新關聯記錄。 我想做相反的事情 - 我想通過關聯的記錄更新父母的記錄。

任何幫助,非常感謝!提前謝謝了!

--mark


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。我直接從我的文件中複製和粘貼這些東西,所以如果你看到任何奇怪的東西,請讓我知道!

+0

FWIW,我會期待accept_nested_attributes_for在這裏工作,但有幾個其他解決方案值得探討...... – 2011-05-11 06:01:42

回答

1

更新您的模型如下:

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 
+0

謝謝Jeremy,當我嘗試讓它運行時,它在現有頁面中工作(用於編輯),但不是創建新的PageContent。我得到的具體錯誤是:Page_contents#新NoMethodError任何提示指向我在正確的方向將不勝感激! – Mark 2011-05-11 14:03:58

+0

馬克,我編輯了我的答案,將優雅地處理沒有頁面關聯的代碼。 – 2011-05-11 16:11:43

+0

謝謝Jeremy,我現在在提交PageContent表單時出錯: 'NoMethodError(undefined method'css_design ='for#): app/models/page_content.rb:13:in'css_design = ' 應用程序/控制器/ page_contents_controller.rb:56:在'新' 應用程序/控制器/ page_contents_controller.rb:56:在'創造」 – Mark 2011-05-11 21:57:39

1

如果不是太多字段,可以通過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?(屬性)),所以它不會用nil覆蓋它。

(對不起,我沒有時間來測試它的時候了,我會稍後重)

相關問題