2017-10-29 5 views
0

나는 지금 당장 느끼는만큼 복잡하지 않아야한다고 생각하는 문제가 있습니다. 상위 폼의 드롭 다운에서 선택한 항목을 기반으로 하위 레코드를 초기화 한 다음 추가 채우기 위해이 하위 항목을 표시합니다 (현재는 항상 2).드롭 다운의 선택에 따라 저장되지 않은 상위 ​​개체의 하위 레코드를 동적으로 초기화합니다.

여기에는 웹과 관련된 몇 가지 주요 해답이 있지만 지금까지는 작동 솔루션을 구축하지 못했습니다.

주요 구성 요소는 다음과 같습니다. 내가

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

선택이 드롭 다운 메뉴에서 드롭 다운 다음 한 새로운 게임 형태로

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 

이 가능한 필터 game_players의 세력 (각 시나리오는 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> 

그러나 나는 내가 아약스 호출에 집착하고 있다고 언급했다. 내 컨트롤러 동작이 시작되지 않고 대신 id = prepare_players로 show-action을받습니다. routes.rb에서 나는 Sebastiáns 조언에 따라 지금 games_controller에서 올바른 행동을 타격하고 같이이

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

UPDATE 있습니다. 하지만 두려워 하듯이 관련 ID를 모른 채 부모에게 새로운 game_players를 추가 할 수는 없습니다. 부모님이 아직 저장되지 않았기 때문에 이드를 그냥 지나치게 쉽게 전달할 수 있지만 그렇지 않습니다.

현재 Rails 5.1.4를 사용 중입니다.

이 기능을 사용하도록 유도하는 지침은 매우 높이 평가됩니다.

답변

1

AJAX 요청에 사용중인 경로가 다른 것보다 먼저 정의되어 있는지 확인하십시오 (예 : resource :games). 노선이 일 이후 인 경우, 그것은 set_game 방법을 발사하고 게임 # 쇼로 리디렉션, 거기 당신은 같은 오류가 발생합니다 수 있습니다 :

4ms의에서 404 찾을 수 없음을 완료 (액티브 : 0 .3MS)

액티브 :: RecordNotFound ( 'ID'로 게임을 찾을 수 없습니다 = prepare_players) :

응용 프로그램/컨트롤러/games_controller.rb : 65 :`set_game '

주에서 games_controller.rb:65:in set_game'`.

+0

감사합니다. 그것은 저를 한 발 전진 시켰습니다. 나는 그 길의 마지막 하나를 가지고있었습니다. – thepanu

+0

지금 오류가 있습니까? 나는 가치가 무엇인지'@ game'을 정의하는 것이 궁금합니다. –

+0

다음 문제입니다. 나는 새로운 행동을 위해 정의 된 @game에 접근 할 수 없다고 의심했다. 그리고 나는 할 수 없다. – thepanu