2017-10-29 14 views
0

私は現時点で私には感じるほど複雑ではないと感じる問題があります。私は、親フォームのドロップダウンで選択した内容に基づいて子レコードを初期化し、次にこれらの子を(現時点では常に2)表示して、さらに充填したいと考えています。ドロップダウンの選択に基づいて未保存の親オブジェクトの子レコードを動的に初期化します

ここにはいくつかの関連性の高い回答がありますが、これまでのところ私は解決策を構築できませんでした。

主要ビルディングブロックは以下のとおりです。フォームで

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_playersのための力(各シナリオには2つのces)。

私はgame.coffee

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:() -> 
    } 

そして、ここで私は立ち往生午前中scenario_idをつかみます。私が読んだことに基づいて、私はgames_controller.rbでこの行動を起こそうとしています。再び、双方にとって、ユーザーからのプレーヤーを選択することが可能である、両方のプレーヤーのためのフォームを表示する必要がありますどのprepare_players.js.erb

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

でこれをレンダリングする必要があります

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 

<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コールに固執しています。私のコントローラーアクションは起動せず、代わりにid = prepare_playersでshow-actionを取得します。私は今games_controllerで正しい行動を打っていますSEBASTIANSアドバイスを1としてroutes.rbでは、私はこの

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

UPDATEを持っています。しかし、私が恐れていたように、私は親に新しいgame_playersを追加することはできません。私はちょうどそれを持っていた場合、IDを渡すことは簡単だろうが、親はまだ保存されていないため、私はしません。

私は現時点でRails 5.1.4を使用しています。

これを動作させるための指針は非常に高く評価されています。

答えて

1

AJAXリクエストに使用しているルートが他のものよりも前に定義されていることを確認してください(例:resource :games)。ルートはこの1つの後であれば、それはset_game方法を発射し、ゲーム#ショーにリダイレクトし、そこには次のようにエラーを受け取りますよ:

4msのに見つからない404を完了(ActiveRecordの:0 。3msの)

はActiveRecord :: RecordNotFound( 'ID' でゲームを見つけることができませんでした= prepare_players):

アプリ/コントローラ/ games_controller.rb:65: `set_game」

games_controller.rb:65:in set_game'`です。

+0

ありがとうございます。それが私を一歩前進させました。私はルートの最後のものとしてそれを持っていた。 – thepanu

+0

エラーが発生しましたか?私は何が価値か、あなたが '@ game'をどこで定義するのか疑問に思っていました。 –

+0

それは次の問題です。私は、新しいアクションのために定義された@gameにアクセスすることができないと思っていました。そして私はできません。 – thepanu

関連する問題