Crie uma instância de jogo no Rails

Portanto, você precisa carregar uma instância de classe no Rails para que seus visitantes possam jogar. Mas Rails geralmente é um site estático com pesquisas estáticas de banco de dados. Então, para isso, vamos atribuir uma instância de classe a uma sala de jogos.

Primeiro, vamos gerar nosso projeto; vamos começar com um iniciador pré-construído do devise / bootstrap. Esta é uma maneira rápida de começar no Mac / Linux. Caso contrário, você pode adicionar manualmente pelo menos um dispositivo para utilizar totalmente este código.

wget bit.ly/newrails
chmod
+x newrails
newrails
GameServer
cd
GameServer

Então, vamos usar o gerador de trilhos para construir o andaime da sala de jogos:

rails g scaffold Game room:string:index min_players:integer max_players:integer kind:integer:index instance:integer
rake db
:migrate

Isso deve exigir muito do trabalho para nós, mas vamos organizar parte da saída gerada. Abra o arquivo app / assets / stylesheets / games.css.scss e solte-o.

table { 
border
-spacing: 10px;
border
-collapse: separate;
}

td
{
padding
-left: 8px;
padding
-right: 8px;
margin
-left: 8px;
margin
-right: 8px;
}

Em seguida, abra sua visualização parcial do formulário em app / views / games / _form.html.erb e altere os campos do formulário para:

<div class="field">
<%= f.label :room %><br>
<%= f.text_field :room %>
</div>
<div class="field">
<%= f.label :min_players %><br>
<%= f.select :min_players, [2,3,4,5], selected: 2 %>
</div>
<div class="field">
<%= f.label :max_players %><br>
<%= f.select :max_players, [2,3,4,5], selected: 5 %>
</div>
<div class="field">
Game:
<%= f.select :kind, Game.kinds.keys, selected: :holdem %>
</div>
<div class="actions">
<%= f.submit %>
</div>

Você notará que removemos o campo “instância” e alteramos 3 dos outros campos para selecionar. Mas não execute ainda, porque precisamos definir o modelo para Game.kinds. Aqui está o model app / models / games.rb

class Game < ActiveRecord::Base
enum kind: [ :holdem, :gin, :rummy ]
validates_presence_of
:room
validates_presence_of
:min_players
validates_presence_of
:max_players
validates
:min_players, numericality: { less_than_or_equal_to: :max_players, message: "must be less than, or equal to, Max players!" }
end

Tudo bem, agora temos as validações e o enumerador de tipo de jogo embutido, então sua visualização parcial do formulário deve funcionar. (neste exemplo, não usaremos gin ou rummy)

Em seguida, vamos adicionar nosso carregador de jogo. Para fazer isso, criaremos um método auxiliar em nosso arquivo app / controllers / application_controller.rb

def load_game(klass, id=nil)
ObjectSpace.each_object(klass).to_a.select {|obj| obj::__id__ == id.to_i}.first || klassy = klass.new
end
helper_method
:load_game

Observe que o objetivo da função é fazer referência ao “jogo atual” que a sala de jogos está executando pelo método. Nós entregaremos a ela uma classe de jogo, como HoldEm, e então teremos certeza de retornar a instância de execução correta da classe HoldEm para usarmos no Rails. E se uma instância não estiver sendo executada, a parte será executada chamando HoldEm.new e retornará a instância dela. NOTA: você precisa ter a atribuição aqui de ou então a instância da classe VAI DESAPARECER, pois não foi atribuída “dentro” do escopo em que foi declarada.Class::__id__klassy = klass.newklassy =

Agora vamos ver como usaremos isso em nosso controlador de jogos. O que vamos fazer é usar a página “mostrar” como a sala de jogo real; então o jogo só precisa estar rodando nessa página. Portanto, modificaremos o método show em app / controllers / games_controller.rb para isto:

def show
@card_game = load_game(HoldEm, (@game.instance? ? @game.instance : nil))
unless @game.instance == @card_game::__id__
@game.update_attribute(:instance, @card_game::__id__)
end
end

Você deve saber que @game já está declarado no início do arquivo. Aqui é atribuído o objeto do jogo real que desejamos iniciar ou continuar e, em seguida, garante que o ID da classe seja salvo na tabela do banco de dados, para esta sala de jogo, em . Enquanto o jogo estiver em execução, esta sala de jogos carregará corretamente a classe de jogo correta. E para executar qualquer uma das funções do jogo, basta chamá-los .before_action :set_game, only: [:show, :edit, :update, :destroy]@card_gameinstance@card_game

Agora vamos atualizar o show view para que você possa ver a instância da classe sendo usada. Altere seu arquivo app / views / games / show.html.erb para este:

<p id="notice"><%= notice %></p>
<p>
<strong>Room:</strong>
<%= @game.room %> <span style="color:grey;">(<%= @card_game::__id__ %>)</span>
</p>
<p>
<strong>Min players:</strong>
<%= @game.min_players %>
</p>
<p>
<strong>Max players:</strong>
<%= @game.max_players %>
</p>
<p>
<strong>Kind:</strong>
<%= @game.kind %>
</p>
<%= link_to 'Edit', edit_game_path(@game) %> |
<%= link_to 'Back', games_path %>

Se você já teve problemas, pode ser porque você não tem uma classe HoldEm definida. Por enquanto, você pode criar um arquivo lib / holdem.rb e colocar o básico nele:

class HoldEm
end

E então certifique-se de que está carregado da pasta lib. No meu caso, porém, senti que era mais fácil carregar no controlador. Então, em meu controlador de aplicativo, adicionei uma linha:

class ApplicationController < ActionController::Base
require Rails.root.join('lib','holdem.rb')

Agora, uma última mudança a fazer. No seu controlador de visitantes, precisamos adicionar um redirecionamento. Portanto, abra app / controllers / Visitors_controller.rb e adicione isto:

class VisitorsController < ApplicationController
def index
if user_signed_in?
redirect_to games_url

end
end
end

Agora tudo deve estar pronto. Execute seu servidor Rails e crie uma conta. Assim que você estiver conectado ao dispositivo, ele o redirecionará para a lista de salas de jogos. Crie um e, na página do programa, clique em atualizar com a frequência que desejar e você verá o ID da classe ao lado do nome da sala de jogos. Isso funcionará fielmente para você, se você quiser provar um caso em que a própria classe de jogo desaparece, tente removê -la do e atualizar várias vezes. Agora você verá o número mudar com frequência. Certifique-se de colocá-lo de volta!klassy =application_controller

Parabéns! Agora você tem controle sobre como executar sua classe de jogo por sala de jogo e garantir que a classe seja carregada corretamente!

Se você estiver preocupado com a possibilidade de muitas classes “de alguma forma” serem criadas, você pode adicionar isso dentro do game_controllersmétodo destroy

@card_game = nil
ObjectSpace.garbage_collect

Embora não tenhamos muito controle quando se trata de coleta de lixo, isso parece destruir todos os objetos que não estão mais atribuídos.

Bem, espero que tenha sido muito útil para você ter sua sala de jogos criada no Rails com sua própria instância de jogo! Agora faça os jogos e divirta-se!

Compartilhe, comente, codifique e Deus abençoe!

-Daniel P. Clark
@ 6ftdan