在rails嵌套属性中编辑连接表值

时间:2013-11-12 19:19:55

标签: ruby-on-rails ruby-on-rails-4 nested-attributes has-many-through

已经坚持了一段时间,所以我想我会把它扔出去。

我有两个模型和一个连接模型:

class Container < ActiveRecord::Base
  has_many :theme_containers
  has_many :themes, :through => :theme_containers
end

class Theme < ActiveRecord::Base
  has_many :theme_containers
  has_many :containers, :through => :theme_containers
end

class ThemeContainer < ActiveRecord::Base
  belongs_to :container
  belongs_to :theme
end

大。我知道这个关联正在工作,因为在控制台中,当我输入Theme.first.containers和Theme.first.theme_containers时,我得到了我期望的模型(我暂时手动创建了theme_container实例)。

问题是,在我的主题表单中,我希望能够更新连接数据的属性,(theme_containers)。

以下是我的表单的简化版本:

<%= form_for(@theme) do |f| %>
  <%= f.fields_for :theme_containers do |builder| %>
    <%= render 'theme_container_fields', f: builder %>
  <% end %>
<% end %>

当我运行它时,container_fields partial只渲染一次,而构建器对象似乎正在查看原始的@theme对象。我的方法在这里有明显的错误吗?我正在尝试做什么?

另外,我正在运行rails 4,所以我没有使用accepts_nested_attributes_for,我设置了强大的参数。我不相信这会影响我的具体问题,而只是把它扔出去。

谢谢!

1 个答案:

答案 0 :(得分:1)

我要做的是以下内容:

class Theme < ActiveRecord::Base
  has_many :theme_containers
  has_many :containers, :through => :theme_containers

  accepts_nested_attributes_for :theme_containers
end

并在你的ThemeController中:

def new
  @theme = Theme.new
  Container.all.each do |container|
    @theme.theme_container.build(container_id: container.id)
  end
end