【问题标题】:Rails 3.1+ Nested Forms Issue: Can't mass-assign protected attributesRails 3.1+ 嵌套表单问题:无法批量分配受保护的属性
【发布时间】:2012-04-20 02:04:00
【问题描述】:

我有一个篮球应用程序,其中一个球员名单有很多球员,一个球员可以在多个球员名单上。(多对多的原因是球员名单档案)

名册.rb

class Roster < ActiveRecord::Base
      belongs_to :team
      has_many :rosterizes
      has_many :players, :through => :rosterizes
      accepts_nested_attributes_for :players
      attr_accessible :jersey_number, :team_id, :class_year, :players
    end

Rosterizes.rb(名字不好我知道...)

class Rosterize < ActiveRecord::Base
  belongs_to :player
  belongs_to :roster
  attr_accessible :player_id, :roster_id
end

Player.rb

class Player < ActiveRecord::Base
  has_many :rosterizes
  has_many :rosters, :through => :rosterizes
  validates_presence_of :first_name, :last_name
  attr_accessible :first_name, :last_name, :active
end

观点

<div class="well">
    <h2>New Player</h2>
    <%= simple_form_for @roster, :url =>player_added_team_path, :html => { :class => 'form-horizontal' } do |f| %>
        <%= f.simple_fields_for @new_player do |x| %>
            <%= x.input :first_name %>
            <%= x.input :last_name %>
        <%end%>
        <%=f.input :class_year %>       
        <%=f.input :jersey_number %>
        <%=f.input :team_id, :as => :hidden, :input_html => {:value => params[:id]}%>

        <div class="well">
        <%= f.button :submit, :class => 'btn-primary icon-plus-sign btn-success', :value => "Add To Team" %>
        </div>
    <%end%>
</div>

我发送给控制器的参数:

"roster"=>{"player"=>{"first_name"=>"first name", "last_name"=>"last name"}, "class_year"=>"freshman", "jersey_number"=>"23", "team_id"=>"1"}, "commit"=>"Add To Team", "id"=>"1"}

处理保存的控制器:

def player_added
   @team = Team.find(params[:id])

   #where the issue is happening
   @roster = @team.rosters.build(params[:roster])
   @roster.save
   ...

end

我有一个使用参数的工作,但是我想了解我在这里做错了什么以供将来/学习目的以及它给我的原因:无法批量分配受保护的属性

我的工作(有点老套):

def player_added

    @team = Team.find(params[:id])
    @roster = @team.rosters.build(:class_year => params[:roster][:class_year], :jersey_number => params[:roster][:jersey_number])
    @new_player = @roster.players.build(:first_name => params[:roster][:player][:first_name], :last_name => params[:roster][:player][:last_name])

    @roster.save
    @new_player.save

    ...

end

我正在使用 Simple_Form 2.0...

我知道这是很多信息,但提前感谢您!

解决方案

以防其他人遇到与我相同/相似的问题...

我安装了这个插件 => https://github.com/ryanb/nested_form

这就是我所做的更改:

名册.rb

class Roster < ActiveRecord::Base
  belongs_to :team
  has_many :rosterizes
  has_many :players, :through => :rosterizes
  accepts_nested_attributes_for :players
  attr_accessible :jersey_number, :class_year, :players, :player_attributes
end

我还将视图更改为:

 <%= simple_nested_form_for @roster, :url =>player_added_team_path, :html => { :class => 'form-horizontal' } do |f| %>
      <%= f.simple_fields_for :players, @roster.players.build do |x| %>
           # nested form
           ...
      <%end%>
      # form
      ...
<%end%>

控制器保存 def player_added

@team = Team.find(params[:id])
@roster = @team.rosters.build(params[:roster])
@roster.save

...

结束

这让我很难理解,希望这会减少你们寻找答案/学习嵌套表格的时间!

【问题讨论】:

  • accepts_nested_attributes_for :players

标签: ruby-on-rails ruby-on-rails-3.1 nested-forms nested-attributes simple-form


【解决方案1】:

问题在于您命名嵌套关联属性的方式以及您发送的参数:

嵌套:players 的属性应为:players_attributes,并且不应列出:team_id(因为它会覆盖团队关联rails 魔法):

attr_accessible :jersey_number, :class_year, :players_attributes

而且参数应该是这样的格式:

"roster"=>{"players_attributes"=>[{"first_name"=>"first name", "last_name"=>"last name"}], "class_year"=>"freshman", "jersey_number"=>"23"}, "commit"=>"Add To Team", "id"=>"1"}

为此,您可能应该将simple_form_for @roster 更改为simple_nested_form_for @roster

请注意,您不需要在"roster" 的参数中包含"team_id" 属性,因为您已经在加载名册并将其关联到它。

【讨论】:

  • 我进行了更改,但现在我遇到了一个新错误,请查看我的编辑。抱歉,如果我的问题/问题很幼稚,我对 Rails 的体验是初学者到中度,也是第一次使用嵌套表单。感谢您的意见和帮助!
  • accepts_nested_attributes_for :players 应该保持不变,只有 attr_accessible 部分需要改变
  • 进行了更改,似乎无法识别simple_nested_from_for 调用i.stack.imgur.com/hU7Dx.png,还将我上面的编辑修复为您最初的意思。
  • 您使用的是最新版本吗?见stackoverflow.com/questions/8195107/…
  • 我正在使用 SimpleForm 2.0,这个 gem => github.com/plataformatec/simple_form,在 github wiki 上,有一个嵌套模型示例,这就是我用来开始使用嵌套表单的方法。我应该转到您列出的宝石吗?
猜你喜欢
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
相关资源
最近更新 更多