如何在没有关联的rails中创建下拉菜单

时间:2016-05-07 17:18:43

标签: ruby-on-rails

我的数据库有一个游戏列表和每个游戏中角色的联结表。我的问题是,如何在下拉列表中显示游戏列表,并且当选择游戏时在另一个下拉列表中显示角色?如果选择另一个游戏,我也会尝试让角色改变。我没有关联,因为我已经在数据库级别创建了所有关系。它们都在数据库级别,因为我有多个应用程序从同一个数据库读取。我找到的所有答案都设置了关联。如何在没有关联的情况下完成此任务,或者我只需要咬紧牙关并添加它们?

1 个答案:

答案 0 :(得分:0)

不完全确定你要问的是什么。你肯定需要联想。角色需要属于游戏。您可以在游戏选择框的on change事件中填充第二个选择框。当选择游戏时,触发ajax调用,该调用使用游戏中的角色填充另一个选择框。这基本上是你需要做的。

  1. 填充游戏选择框。

    f.select(:game_id, options_for_select([["game name", game_id], ["game 2", game_id_2]]))
    
  2. 在更改时,触发对自定义控制器操作的ajax调用,该操作会在游戏选择框中传递所选值的ID。

    $(document).on("change", "#game_id_selector", function(e){
       e.preventDefault()
       $.ajax({
          type: "POST",
          url: "games/get_characters",
          data: {
             game_id: $("#game_id_selector").val()
          }
       }).done(function(ajax_response){
         // append the characters to the other select box using .append()
       })
    })
    
  3. 准备好自定义控制器操作和相应的路径。

    resources :games do
       collection do
          post "get_characters"
       end
    end        
    
    def get_characters
      game = Game.find(params[:game_id])
      characters_arr = []
      game.characters.each {|char| characters_arr << [char.name, char.id] }            
      render json: {data: characters_arr}
    end
    
  4. 在控制器内部操作中,收集与该游戏相关的所有角色。

  5. 在json响应中将这些发送回ajax调用。
  6. 将这些字符附加到第二个选择框。
  7. 基本上,这是你需要做的。而且你需要角色属于游戏才能做到。