Как передать аргументы со страницы показа одной модели в контроллер создания другой модели? - PullRequest
0 голосов
/ 07 марта 2011

У меня есть модели пользователей, игр и игроков, и на странице показа моей игры я пытаюсь создать игрока, который будет ассоциироваться как с текущим пользователем, так и с игрой.

Итак, я нахожусь на странице blah.com/game/1 (показать страницу игры с идентификатором 1) и хочу нажать кнопку, чтобы создать игрока.

На странице моей игры:

  # I have @game here which is a reference to the game for this page
  # can I use it here to fill in @player.game ?
  <%= form_for(@player) do |f| %>
      <%= f.submit "Create player for this game (join this game)" %>
  <% end %>

Затем в методе создания моего PlayerController:

  # PlayerController's create, called from Game's show page
  def create
    @terra_player = current_user.players.build() # approximation of how it works
    if @terra_player.save
      redirect_to @terra_player
    else
      render 'new'
    end
  end

Полагаю, мне нужно вручную указать аргумент для игры, но я не уверен, как получить ссылку на мою игру. Я полагаю, мне нужно будет ввести аргумент в контроллере создания:

  @terra_player = current_user.players.build(:game => ???) # approximation of how it works

Или установите его на странице показа. Но я не уверен, как в любом случае.

Ответы [ 2 ]

3 голосов
/ 07 марта 2011

Ваши модели здесь немного сумасшедшие; Я бы сказал, что вам нужно очистить семантику. Просто сделаю удар здесь, но я предполагаю, что лучше подходить к этому с мыслью, что игроки более тесно связаны с играми, чем пользователи. Ваши модели должны выглядеть примерно так:

class User < ActiveRecord::Base
  has_many :players
  has_many :games, :through => :players
end

class Game < ActiveRecord::Base
  has_many :players
  validate :max_players_in_game #left as exercise to reader
end

class Player < ActiveRecord::Base
  belongs_to :user
  belongs_to :game
end

Тогда на ваших маршрутах у вас будет вложенный ресурс для игры:

resources :games do
  resources :players
end

так что ваши URL будут выглядеть примерно так: POST /games/1/players. В вашем PlayersController:

class PlayersController < ApplicationController
  def create
    @game = Game.find(params[:game_id])
    @player = @game.players.build(:user => current_user)
    if @player.save
      redirect_to @game
    else
      render "new"
    end
  end
end
0 голосов
/ 07 марта 2011

Жутким способом было бы

MyController.new.create_method parameters

Я предлагаю не делать этого.: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...