2016-03-31 2 views
0

Ich versuche, eine Anwendung zum Speichern von gespielten FIFA-Spiele zu machen.Mit einer if-Funktion in Controller

Jetzt kann ich schon Accounts machen, Spiele speichern usw. Aber wenn ich ein Spiel in der DB ablege, möchte ich auch den Gewinner und Verlierer des Spiels so speichern, wie ich kann Verwenden Sie später die Zählfunktion, um zu zählen, wie viele Gewinne oder Verluste ein Benutzer hat.

Controller:

class GamesController < ApplicationController 
    before_action :authenticate_user!, exept: [:index, :show] 

    def index 
     @games = Game.all 
    end 

    def new 
     @game = current_user.games.build 
     @user_options = User.all.map{|u| [ u.user_name, u.id ] } 
    end 

    def create 
     @user_options = User.all.map{|u| [ u.user_name, u.id ] } 

     @game = Game.new(game_params) 
     @game.home_team_user_id = current_user.id 

     if @game.home_score > @game.away_score 
      @game.winner_id = @game.home_team_user_id 
      @game.loser_id = @game.away_team_user_id  
     else if @game.home_score < @game.away_score 
      @game.winner_id = @game.away_team_user_id 
      @game.loser_id = @game.home_team_user_id 
     else 
     end 

     if @game.save 
      redirect_to games_path, :notice => "Successfully added game!" 
     else 
      render 'index' 
     end 
    end 

    def show 
     @games = Game.all 
    end 

    def destroy 
     @game = Game.find(params[:id]) 
     @game.destroy 
     redirect_to games_path 
    end 

    private 
    def find_game 
     @game = Game.find(params[:id])  
    end 

    def game_params 
     params.require(:game).permit(:home_team_user_name, :home_score, :away_team_user_name, :away_score, :home_team_user_id, :away_team_user_id, :winner_id, :loser_id) 
    end 
end 
end 

Ausblick:

<div class="col-md-12" style="text-align:center"> 
    <div class="panel panel-default" style="margin-right:10px"> 
    <div class="panel-heading"> 
     <h3 class="panel-title">Submit New Match</h3> 
    </div> 
    <div class="panel-body"> 
     <%= simple_form_for(@game) do |f| %> 
     <%= f.text_field :home_score, :placeholder => "Your score" %> 
     <%= f.text_field :away_score, :placeholder => "Your Opponents score" %> <br><br> 
     <p>Opponent:</p> 
     <%= f.select(:away_team_user_id, @user_options) %> 
     <br> <br> <%= f.submit "Submit Match", class: "btn-submit" %> 
     <% end %> 
    </div> 
</div> 

Ist dies der richtige Weg, um diese Berechnung zu machen? Oder haben Sie andere Vorschläge?

Ist dies der richtige Weg, warum dann bekomme ich diese Fehlermeldung, wenn ich versuche, das Formular abschicken:

undefined lokale Variable oder Methode `game_params' für

Wie Sie in der Steuerung sehen können, fehlt die game_params nicht. Ich habe jedoch am Ende eine end hinzugefügt, weil dies einen Fehler beim Laden des Formulars gab.

Antwort

1

Das Problem verursacht durch:

else if @game.home_score < @game.away_score 

es sein sollte:

elsif @game.home_score < @game.away_score 

Dann können Sie Dies verursacht Probleme mit den Verfahren Anfänge

einer der letzten beiden end entfernen/Endungen und bedingte Anfänge/Endungen.

+0

Oh Gott, ich hasse dumme Fehler. Danke vielmals! –

+0

Kein Problem! Das haben wir alle schon durchgemacht. – MTarantini

0

Modelle in MVC sind verantwortlich für die Durchsetzung der Geschäftslogik. Diese Berechnung sollte also in Ihrem Modell stattfinden - nicht im Controller.

class Game < ActiveRecord::Base 

    # ... 

    belongs_to :winner, class_name: 'User' # or Team or whatever 
    belongs_to :loser, class_name: 'User' 

    before_validation :evaluate_score!, if: -> { home_score.present? } 

    private 

    def evaluate_score! 
     self.winner = home_score > away_score ? home_team_user : away_team_user 
     self.loser = home_score < away_score ? home_team_user : away_team_user 
    end 
end 

Zusätzlich Diese Linie ist ineffizient:

@user_options = User.all.map{|u| [ u.user_name, u.id ] } 

, da es die gesamte Datensätze aus der DB zieht und dann durch sie in Speicherschleifen. Sie könnten @user_options = User.pluck(:username, :id) verwenden, aber es ist nicht notwendig, da Schienen große Helfer haben für Eingänge von Sammlungen zu erstellen:

<%= f.collection_select(:away_team_user, User.all, :id, :user_name) %> 

Einfaches Formular eine association Helper-Methode hat, die die Schienen collection_* Helfer pimps up:

<%= f.association :away_team_user, collection: User.all, label_method: :user_name %> 
+0

Ich stimme zu. Schöne Ergänzung! – MTarantini

+0

Danke dafür, ich überprüfe es! –

Verwandte Themen