1

ルート ファイル:

resources :tournaments do
    resources :game, :only => [:new, :index, :create, :update, :destroy]
end

レーキルートは以下を示します:

 new_tournament_game GET    /tournaments/:tournament_id/game/new(.:format)          game#new

電話する:

<td><%= link_to 'Add Game',  new_tournament_game_path(tournament) %></td>

ゲームモデル:

次の URL のゲーム ビューに移動します: http:// local host:3000/tournaments/2/game/new

そして見る:

<h1>New Game in <%= @tournament.name %> Tournament</h1>

<fieldset>
   <%= form_for [:tournament, @game], :url => tournament_game_index_path do |f| %>
    <table>
      <td>
       .... More fields .....
      </td>
  <div class="form-actions">
    <%= f.submit "Create %>
  </div>
<% end %>

作成をクリックすると、次のエラーが発生します。

undefined method `game_url' for #<GamesController:0xb6131e40>



質問:
ネストされたルートまたは隠しフィールドを使用する必要がありますか?
トーナメント ゲームの呼び出しを処理するには、別の tourment_game コントローラー/ビューが必要ですか?
[作成] ボタンをクリックしたときに正しい作成ルートを探すにはどうすればよいですか?
2 つのテーブル間に関係を持たせたい場合、ネストされたリソースと has_many / belongs_to 呼び出しだけが必要ですか、それとも Tournament などの外部キー列が必要ですか?

1つのスレッドでの質問で申し訳ありません。あなたが提供できるどんな助けも大歓迎です!

ありがとうございました。

編集:

このエラーは、create コントローラーの行である行 39 を参照しています。

    class GamesController < ApplicationController
  # GET /game
  # GET /game.json
  def index
    @game = Game.all
    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @game }
    end
  end

  # GET /game/1
  # GET /game/1.json
  def show
    @game = Game.find(params[:id])
    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @game }
    end
  end

  # GET /game/new
  # GET /game/new.json
  def new
    @game = Game.new
    @tournament = Tournament.find(params[:tournament_id])

  end


  # GET /game/1/edit
  def edit
    @game = Game.find(params[:id])
  end
  # POST /game
  # POST /game.json
  def create
    @tournament = Tournament.find(params[:tournament_id])
    @game = @tournament.game.build(params[:game])

    respond_to do |format|
        if params[:commit] != 'Cancel'
          if @game.save
            format.html { redirect_to @game, notice: 'Game was successfully created.' }
            format.json { render json: @game, status: :created, location: @game }
            format.json { render json: @game }            
          else
            format.html { render action: "new" }
            format.json { render json: @game.errors, status: :unprocessable_entity }
          end
        else
          format.html { redirect_to @game, alert: 'Game was not updated.' }
        end
    end
  end

  # PUT /game/1
 # PUT /game/1.json
  def update
    @game = Game.find(params[:id])


    respond_to do |format|
      if params[:commit] != 'Cancel'
        if @game.update_attributes(params[:game])
          format.html { redirect_to @game, notice: 'Game was successfully updated.' }
          format.json { render json: @game }      
        else
          format.html { render action: "edit" }
          format.json { render json: @game.errors, status: :unprocessable_entity }
        end
      else
          format.html { redirect_to @game, alert: 'Game was not updated.' }
      end
    end
  end

  # DELETE /game/1
  # DELETE /game/1.json
  def destroy
    @game = Game.find(params[:id])
    @game.destroy

    respond_to do |format|
      format.html { redirect_to game_url }
      format.json { head :no_content }
    end
  end
end
4

1 に答える 1

2

これを試して:

<%= form_for @game, :url => tournament_games_path(@tournament) do |f| %>

これにより、コントローラーのcreateメソッドが呼び出されますgames

ゲームコントローラ:

def create
  @tournament = Tournament.find(params[:tournament_id])
  @game = @tournament.games.build(params[:game])
  if @game.save
    flash[:success] = "Game created successfully"
    redirect_to tournaments_path
  else
    render new_tournament_game_path
  end
end

ルート:

resources :tournaments do
   resources :games, :only => [:new, :index, :create, :update, :destroy]
end
于 2013-02-08T19:16:15.900 に答える