簡體   English   中英

如何在Ruby on Rails中使用一個表單更新兩個模型?

[英]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_attributesfields_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM