在Def New中默认初始化多对多关系

时间:2014-05-11 18:06:08

标签: ruby-on-rails-4 many-to-many has-many-through strong-parameters

在Rails 4.0中,我有gamegame_item(查找表)和item之间的多对多关系。如何在创建新游戏时初始化与现有项目的默认关系?

game.rb:

class Game < ActiveRecord::Base
  has_many :game_items
  has_many :items, :through => :game_items
  accepts_nested_attributes_for :game_items
end

game_item.rb:

class GameItem < ActiveRecord::Base
  belongs_to :game
  belongs_to :item
  accepts_nested_attributes_for :item
end

item.rb的:

class Item < ActiveRecord::Base
  has_many :game_items
  has_many :games, :through =>  :game_items
end

项目已存在于数据库中,无需创建,但需要更新。在创建新的Game对象时,我想将几​​个Items与它关联起来。

games_controller.rb:

  # GET /games/new
  def new
    @game = Game.new
    @game.items = Item.all(:order => 'RANDOM()', :limit => 3)
  end

这似乎有效,因为我在games/new.html.erb中使用以下代码查看它们:

<p>
  <% @game.items.each do |item| %>
      <%= item.name %> 
  <%end %>
</p>

问题在于,通过GameController #create方法保存游戏时,关系不会保存到查找表game_items中。

 # POST /games
  # POST /games.json
  def create
    @game = Game.new(game_params)

    respond_to do |format|
      if @game.save
        format.html { redirect_to @game, notice: 'Game was successfully created.' }
        format.json { render action: 'show', status: :created, location: @game }
      else
        format.html { render action: 'new' }
        format.json { render json: @game.errors, status: :unprocessable_entity }
      end
    end
  end

我相信这是强大的参数,不允许保存关系,尽管

  # Never trust parameters from the scary internet, only allow the white list through.
    def game_params
      #params.require(:game).permit( :correct, :incorrect,  :timed_out,  item_attributes: [:id, :name])[] )
      params.require(:game).permit( :correct, :incorrect,  :timed_out, :item_ids => [])

     end

我知道我可以使用

create中再次建立关系
  # POST /games
  # POST /games.json
  def create
    @game = Game.new(game_params)
    @game.items = Item.all(:order => 'RANDOM()', :limit => 3)
  ...

但由于这些项是随机的,我需要保存在用户首次使用game方法启动new对象时呈现给用户的项目。

如何保存game_item关系?

编辑:

@phoet建议的解决方案。使用隐藏字段传递数组。

<% @game.items.each do |item| %>
    <%= f.hidden_field :item_ids, :multiple => true, :value => item.id %>
<% end %>

1 个答案:

答案 0 :(得分:1)

您使用名为item_ids[]的隐藏字段,并将项目数组分配给它。