Rails 4嵌套属性和sti模型update_attributes创建新记录

时间:2013-10-23 08:53:47

标签: ruby-on-rails nested-attributes sti

我有一个使用页面模型运行的rails 4实例,它具有不同类型的页面内容,如PageContent :: Text,它继承自PageContent。

在我的表单中,我可以在表格摘要中看到我所有的@ page.page_contents ..

如果我更新我的页面,记录不会更新,它们将被创建为新记录。

# update controller
class Admin::PagesController < Admin::BaseController

  def update
    @page = Page.find_by_url(params[:id])

    respond_to do |format|
      if @page.update_attributes(page_params(@page.type.parameterize.gsub('page','')))
        format.html { redirect_to edit_admin_page_path(@page) }
      else
        format.html { render :action => "edit" }
      end
    end
  end

  def page_params(type)
    params.require("#{type}_page".to_sym).permit(:name, :contents_attributes => [:body, :type])
  end

end

# content model
class PageContent::Text < PageContent
end

# page model
class Page < ActiveRecord::Base
  has_many :contents, class_name: 'PageContent', dependent: :destroy
  accepts_nested_attributes_for :contents
end

# form snippet
<textarea class="form-control wysihtml5" id="content_page_contents_attributes_0_body" name="content_page[contents_attributes][0][body]">
testsetseet</textarea>
<input id="content_page_contents_attributes_0_type" name="content_page[contents_attributes][0][type]" type="hidden" value="PageContent::Text" />
<input id="content_page_contents_attributes_0_id" name="content_page[contents_attributes][0][id]" type="hidden" value="1" />

非常欢迎任何想法!

提前致谢

1 个答案:

答案 0 :(得分:4)

也许只需将:id添加到.permit(:name, :contents_attributes => [:body, :type])即可解决问题?

结果应该看起来像:contents_attributes => [:body, :type, :id]

另请查看服务器标准输出 - 它输出不允许的属性。