javascript - 根据下拉列表中的选择动态初始化未保存父对象的子记录

标签 javascript ruby-on-rails ajax coffeescript

我有一个问题,我觉得这个问题不应该像我现在感觉的那么复杂。我想根据父表单中下拉列表中的选择来初始化子记录,然后显示这些子记录(目前始终为 2)以供进一步填充。

这里和网络上的其他地方有几个最相关的答案,但到目前为止我未能构建一个可行的解决方案。

主要构建 block 如下。

game.rb(父级)

class Game < ApplicationRecord
  has_many :game_players, dependent: :destroy
  belongs_to :scenario

  accepts_nested_attributes_for :game_players
end

game_player.rb(子级)

class GamePlayer < ApplicationRecord
  belongs_to :game
  belongs_to :user
  belongs_to :force
end

在新游戏的表单中,我有以下下拉列表

<div class="form-group">
  <%= form.label :scenario_id %>
  <%= form.collection_select :scenario_id, Scenario.all, :id, :name, {},     { class: "form-control" }   %>
</div>

从此下拉列表中进行的选择会过滤游戏玩家可能的力量(每个场景都有两个相反的力量)。

我在game.coffee中获取scenario_id

jQuery ->
  scenarios = $('[name*=scenario_id]').html()
  $('[name*=scenario_id]').change ->
    scenario_id = $('[name*=scenario_id] :selected').val()
    params = 'scenario_id=' + scenario_id
    $.ajax {
      url: "/games/prepare_players",
      data: params
      success: () ->
    }

我被困在这里了。根据我所读到的内容,我正在尝试在 games_controller.rb 中启动此操作。

def prepare_players
  forces = ScenarioForce.where(scenario_id: params[:scenario_id])
  forces.each do |force|
    @game.game_players << GamePlayer.new( force_id: force.id)
  end
  respond_to do |format|
    format.js
  end
end

这应该再次在 prepare_players.js.erb

中呈现此内容
$('[name=player-cards]').html("<%= escape_javascript(render partial: 'players', locals: {form: form}).html_safe %>")

这应该显示双方玩家的表单,可以从双方的用户中选择玩家。

<div name="player-cards">
  <h3>Players</h3>
  <% @game.game_players.each do |player| %>
    <p><%= player.force.name %></p>
    <%= form.fields_for player do |pf| %>
      <div class="form-group">
        <%= pf.label :name %>
        <%= pf.collection_select :user_id, User.all, :id, :full_name, {},     {class: "form-control"}  %>
      </div>
    <% end %>
  <% end %>
</div>

但正如我提到的,我陷入了 Ajax 调用中。我的 Controller 操作没有被触发,而是得到了 id=prepare_players 的 show-action。在routes.rb中我有这个

get 'games/prepare_players', to: 'games#prepare_players'

更新根据塞巴斯蒂安的建议,我现在在 games_controller 中执行正确的操作。但正如我担心的那样,在不知道相关 ID 的情况下,我无法将新的 game_players 添加到我的父级中。如果我只有一个 id,那么传递 id 会很容易,但我没有,因为父级尚未保存。

我现在使用的是 Rails 5.1.4。

非常感谢任何指导我实现这一目标的指示。

最佳答案

确保您用于 AJAX 请求的路由先于任何其他请求定义,例如 resource :games。如果路线在此之后,那么它将触发 set_game 方法并将您重定向到 games#show,然后您将收到如下错误:

Completed 404 Not Found in 4ms (ActiveRecord: 0.3ms)

ActiveRecord::RecordNotFound (Couldn't find Game with 'id'=prepare_players):

app/controllers/games_controller.rb:65:in `set_game'

注意 games_controller.rb:65:inset_game'`。

关于javascript - 根据下拉列表中的选择动态初始化未保存父对象的子记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46999958/

相关文章:

ruby-on-rails - 无方法错误 : undefined method `deliver_now'

javascript - Karma 和 CoffeScript 以及代码覆盖率

javascript - 如何使用 jQuery 向 Dictionary.com 的 REST API 发出 AJAX 请求?

javascript - 尝试在 html 电子邮件中插入一个 ajax 调用

ruby-on-rails - Windows 上的 Rails 测试错误 "UNIXServer is required (LoadError)"

jquery - SSL CORS 不适用于 Zend Guard

javascript - 如何使用ajax将新页面加载到div

javascript - 重构用户脚本以使用 javascript 模块

javascript - 如何在 Golang 中遍历数据并在 Javascript 中使用时创建唯一 ID

javascript - 如何在 Javascript 中推送每个元素 2 个属性的数组?