Доступ к переменным с разных контроллеров - PullRequest
0 голосов
/ 14 июля 2011

Я пытаюсь построить игру, в которой вы угадываете числа.Проблема в том, что если вы допустили ошибку, она перенаправляет вас в форму списка лидеров (mvc), где вы вводите свое имя и предварительно заполняете данными сессий из другого контроллера (игры) и отправляет их в БД.

@ round & @points - это две переменные, к которым я хочу получить доступ и сохранить их как балл и уровень.

class ApplicationController < ActionController::Base


  before_filter :set_current_account

  def set_current_account
    #  set @current_account from session data here
    Game.current = @round
  end   


  protect_from_forgery

end

-

class Leaderboard < ActiveRecord::Base
    cattr_accessor :current
end

# == Schema Information
#
# Table name: leaderboards
#
#  id         :integer         not null, primary key
#  name       :string(255)
#  score      :string(255)
#  level      :string(255)
#  created_at :datetime
#  updated_at :datetime
#

-

class GameController < ApplicationController

  def index
    @games = Game.all
    respond_to do |format|
      format.html 
    end
  end

  def start_game
    session[:round] ||= 1
    session[:points] ||= 0
    @round = session[:round]
    @points = session[:points] 
  end


  def generate_round
    numbers = Array.new(6){rand(9)}
    @addition = []
    @display = numbers
    numbers.inject do |s, i|
        @addition << s + i
        @addition.last
    end
  end

  def next_round
    session[:round] += 1
    session[:points] += 1200
    @round = session[:round]
    @points = session[:points]
  end

  def destroy_sessions
    session[:round] = nil
    session[:points] = nil
    session[:addition] = nil
    @round = session[:round]
    @points = session[:points]
    @addition = session[:addition]
    start_game
  end

  def submit_name
    @game = Game.new(params[:game])

    respond_to do |format|
      if @game.save
        format.html { redirect_to(leaderboard_path, :notice => 'Score was added successfully.') }
      else
        format.html { render :action => "new" }
      end
    end
  end

  def game_over
    redirect_to :controller => 'leaderboards', :action => 'new' and return
  end

Ответы [ 2 ]

1 голос
/ 15 июля 2011

Я не прочитал все это, но если вы просто хотите получить доступ к этим переменным, вы можете просто передать их в качестве параметров.

  1. Передать эти значения в game_over как параметры

  2. Используйте это для перенаправления

redirect_to: controller => 'списки лидеров',: action => 'new' и return,: round => params [: round],: points => params [: points]

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

0 голосов
/ 14 июля 2011

Я думаю, что вы выбрали подход, который не должен даже работать. Платформа Rails MVC построена вокруг принципа, что каждый запрос обслуживается независимо, и что, теоретически, нет передачи состояния от одного запроса к другому, кроме как через params, записи, хранящиеся в базе данных и постоянном пользователе session.

Создание такого веб-приложения, как вы, может быть ошибкой для однопользовательской однопроцессорной программы. Использование синглетонов, таких как cattr_accessor с именем current, будет проблематичным, так как оно совместно используется запросами и не разделяется между различными экземплярами Rails, которых обычно много.

Поможет более точное сопоставление со стандартом REST index, new, create, show, edit, update и destroy. Например, start_game должно быть create, а destroy_sessions, вероятно, должно быть destroy.

Из вашего дизайна неясно, является ли каждая игра общей для нескольких пользователей, или если они созданы для каждого пользователя индивидуально, поэтому трудно сказать больше о том, как решить вашу проблему.

...