打破轨道MVC:通过AJAX直接将数据从模型发送到视图

时间:2014-08-16 17:47:05

标签: ruby-on-rails ruby ajax multithreading

我正在使用Rails创建MUD。这是我到目前为止所得到的: enter image description here

现在我正在研究战斗系统。我的战斗系统会像这样工作:

  1. current_user会看到房间中的字符和non_player_characters
  2. 当current_user攻击另一个角色时,其他角色有5秒钟来"偏转"攻击或他们被击中。 (未完全实施)
  3. 当current_user攻击NPC时,有50%的NPC会转移攻击
  4. NPC会向用户发送攻击,用户必须在适当的时间间隔内转移攻击(未完全实施)。
  5. 为了实现这个战斗系统,我决定使用多线程和计时器:

      def initiate_attack
        Thread.new do
          sleep(5)
          hit_target
          ActiveRecord::Base.connection.close
        end
      end
    
      def non_player_character_failed_to_deflect
        (1 + rand(10)) < 5
      end
    
      def is_non_player_character?
        @attack.target_type == "NonPlayerCharacter"
      end
    
      def hit_target
        if is_non_player_character?
          if non_player_character_failed_to_deflect
            damage_target
          else
            puts "Deflected"
          end
        else
          "hit player"
        end
      end
    
      def damage_target
        @target.update(power_level: @target.power_level - 10)
      end
    

    就纯功能而言,这是有效的,但问题是我无法弄清楚如何将字符串返回到视图以便用户可以看到它们。用户应该在发起攻击的任何人以及攻击完成后看到消息。我认为这样做的主要问题是,使用多线程MVC会被破坏,因为模型中的线程在控件返回控制器并查看后仍然在运行。

    总结一下我的问题:   1)如何使用AJAX来持续更新我的视图以及来自模型的数据?

    有关更多信息,请访问该项目的github页面: enter image description here

1 个答案:

答案 0 :(得分:1)

您需要一种将数据推送到浏览器的方法。要做到这一点,你有几个选择:

我会尝试一下message_bus gem。

编辑:您也可以尝试(Sidekiq)[http://sidekiq.org/]来运行异步代码 - 我相信您会发现使用它的代码从长远来看更容易维护,特别是与使用方法相比线程直接。