Rails collection_select表单将选定的值添加到数组中

时间:2015-06-29 16:19:30

标签: ruby-on-rails forms

我有一个Rails 4应用程序,它是一个游戏数据库。与此问题相关的模型是:

  • 游戏
  • 类型
  • GameGenre(关系表)

它有一个游戏/新表单,可以创建新的游戏记录。

在该表单中,我想要一个允许用户添加流派的子表单。我认为它的工作原理如下:

  1. 用户从选择输入中选择一种类型。选项从Genre.all
  2. 填充
  3. 当用户点击“添加”按钮时,所选类型的ID将被推送到数组。他们可以为这个数组添加任意数量的类型。
  4. 当用户在主游戏表单上点击“保存”时,该应用程序使用我定义的add_genre函数为每个类型创建GameGenre关系记录。
  5. 这是我目前的games/new.html.erb观看代码:

    <div id="game-genres-form">
      <%= fields_for(@game.game_genres.build) do |f| %>
        <div><%= hidden_field_tag :game_id, @game.id %></div>
        <div class="form-group">
          <%= f.label :genre_id, "Add a genre" %>
          <div class="input-group">
            <%= f.collection_select :genre_id, Genre.all, :id, :name,
                                            {}, {:class=>'form-control'} %>
            <span class="input-group-btn">
              <%= f.submit "Add", class: "btn btn-default" %>
            </span>
        </div>
      <% end %>
    </div>
    

    这不起作用,因为fields_for(@game.game_genres.build)不正确。事实上,目前当我点击“添加”时,它会提交新游戏表单并创建一个游戏记录,但不会添加该类型。

    我认为我需要知道的是,我使用什么代替fields_for(@game.game_genres.build)将提交的类型传递给新数组?我如何在games_controller.rb

    中进行设置

    我意识到<div><%= hidden_field_tag :game_id, @game.id %></div>没有必要(因为game_id在新游戏记录保存之前不存在)。

    我希望我有意义,谢谢你的帮助。

    这些是我目前的关联,他们缺少accepts_nested_attributes_for。我现在不太担心这个问题 - 我主要想知道正确使用的表单类型,以及如何使每个类型添加到散列/数组。

    class Game < ActiveRecord::Base
      belongs_to :user
    
      has_many :game_genres,  foreign_key:  :game_id,
                              dependent: :destroy
    
      has_many :genres, through: :game_genres
    
    class GameGenre < ActiveRecord::Base
    
      belongs_to :game
      belongs_to :genre
    
    class Genre < ActiveRecord::Base
      belongs_to :user
    
      has_many :game_genres,  foreign_key:  :genre_id,
                              dependent: :destroy
    
      has_many :games, through: :game_genres
    

1 个答案:

答案 0 :(得分:0)

可能你在游戏模型中遗漏了这样的东西

accepts_nested_attributes_for :game_genres ,allow_destroy: true

或者您可以尝试将此类型保存在视图中

<%= collection_select(:category, :ids, Category.all, :id, :category, { :selected => @categories.map{|m| m.id}}, {:multiple=>true}) %>