新手问题 实例变量跨控制器无法保留吗?

zix · 2016年10月28日 · 最后由 flemon1986 回复于 2016年10月31日 · 1671 次阅读

mode

class Game < ApplicationRecord
  @bomb_array
def g_bomb
    @bomb_array = 1
end

def bomb
    puts "查询炸弹"
    puts @bomb_array
end

contoller

def test
    puts "生成炸弹"
    @game.g_bomb
end

def start
    @game = Game.find(params[:id])
    puts @game.bomb
end

我在 test 里给@bomb_array赋值,在 start 里查询值,会是空 这是为什么。。

1 楼 已删除

1. 访问的变量不一样

  @bomb_array # 这是类实例变量
def g_bomb
    @bomb_array = 1 # 这是实例变量
end

要在实例方法里修改类层面的变量,要用类变量 @@bomb_array

2. 如果在生产环境用类变量储存状态,会遇到不同的请求竞争一个变量,不要这么做。

#2 楼 @Rei 我想要的应该是实例变量,每一个实例有一个 bomb_array……

#3 楼 @zix 那么需要在数据库里加一个字段作持久化,每次 .find 都是新对象。

#4 楼 @Rei 原来是这样。。谢谢

@game = Game.find(params[:id])这句会给@game定义一个新的实例,此@game非彼@game也 而且可以给类实例attr_accessor :bomb_array

需要 登录 后方可回复, 如果你还没有账号请 注册新账号