rails 3从不同的控制器更新模型

时间:2013-02-01 16:27:58

标签: ruby-on-rails-3 forms model-view-controller

我有3张桌子:超级英雄,权力,团队

超级英雄可以拥有许多权力和许多团队。

例如:

superhero.rb
  name:string

  has_many :power_teams, :dependent => :destroy
  has_many :powers, :through => :power_teams, :foreign_key => :power_id 
  has_many :teams, :through => :power_teams, :foreign_key => :team_id

power.rb
  name:string
  has_many :power_teams, :dependent => :destroy

team.rb
  name:string
  has_many :power_teams, :dependent => :destroy

#This is what I want to add to
power_team
  belongs_to :superhero
  belongs_to :power
  belongs_to :team

更新这里是超级英雄的控制器

def create
  @hero = Superhero.new(params[:hero])

形式:

<%= form_for(@hero) do |f| %>

  <%= f.label :name %><br />
  <%= f.text_field :name %>

  #Teams are a drop-down, you can only choose 1 team
  <%= f.collection_select(:team_ids, Team.all(:order=>:name), :id, :name, {:prompt => true}) %>

  #powers are checkboxes, you can choose multiple powers
  <% Power.all.each do |power| %>
     <label class="checkbox">
     <%= check_box_tag "superhero[power_ids][]", power.id, @hero.power_ids.include?(power.id) %>
     <%= power.name %>
     </label>
  <% end %>
<% end %>

当我保存时,1个团队和2个权力我得到了这个(在索引页面中):

Hero | Power | Team
  1      1     
  1      2
  1              1

这是对的吗?我以为我会看到并期待这个:

Hero | Power | Team
  1      1       1
  1      2       1

1 个答案:

答案 0 :(得分:0)

你说你想在权力和团队之间建立一种关系,而power_team目前只有一个权力宣告关联。如果你在power_teams表上有team_id,那么你也应该在power_team模型中有这个:

belongs_to :team

这可能不是唯一的问题。由于您仅部分定义了模型,未定义模式,并且未提供用于尝试更新的表单等的代码,因此很难说清楚。

确保在每个模型中都设置了关联的关联,并且关联的定义匹配。如果belongs_to在模型表中有外键列,则使用belongs_to;如果是具有为此模型定义的外键列的关联模型表,则使用has_one / has_many(取决于您希望返回的记录数);或者has_and_belongs_to_many(又名“HABTM”)如果你有一个只有 有两列的连接表 - 一个用于它加入的两个表的每个外键。看起来你已经完成了少数的依赖性破坏,所以不必提及。如果要与旧模式集成,那么如果在关联的任一侧使用非标准表名,非标准连接表名,非标准外键列名和/或ID,或非标准模型类名,然后您需要为关联的两侧正确设置关联的其他选项。

即使您在评论中注意到质量分配安全性不是问题,但请确保如果您希望更新关联对象(并假设您使用Rails 3.1+具有质量分配安全性和白名单,这是最新的默认值3.2.x)您要将_attributes添加到attr_accessible中定义的属性名称的末尾,以获取您接受嵌套属性的内容。在Rails 4中,质量分配安全性正在消失,所以如果您对使用strong_parameters感兴趣,那么这将是研究其他新Rails 4技术(rails-api,ActiveModel :: Serializers等)的好时机。目前可以在Rails 3中使用。

更新

由于问题已更新,我现在看到超级英雄与power_teams有关联,反之亦然。超级英雄或power_team中没有必要使用该关联,因此我将其删除。在问题中控制器似乎仍然存在一些丢失的代码,因为它应该在加载创建表单时路由到“新”操作方法,并且用于接受表单提交的“创建”操作方法,所以那里至少应该有两种叫做“新”和“创造”的方法。启动一个新项目并使用rails生成脚手架方法来获得最初的东西,这是一个好主意,因为你已经拥有架构(我刚才提到的更改是为了删除power_team的超级英雄关联,反之亦然) 。我知道你不是基于其他问题对Rails不熟悉的,但是以基线为例总是好的:http://guides.rubyonrails.org/getting_started.html