Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在方法参数中传递大对象可以吗?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 在方法参数中传递大对象可以吗?

Ruby on rails 在方法参数中传递大对象可以吗?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在做一个Rails应用程序,人们可以参加测验。我有一款浏览器游戏,负责控制器逻辑(会话、重定向等)。目前,这是我的#初始化方法: class BrowserGame def initialize(controller) @controller = controller end end 在控制器中我有一个方法 class GamesController < ApplicationController # actions private def brow

我正在做一个Rails应用程序,人们可以参加测验。我有一款浏览器游戏,负责控制器逻辑(会话、重定向等)。目前,这是我的#初始化方法:

class BrowserGame
  def initialize(controller)
    @controller = controller
  end
end
在控制器中我有一个方法

class GamesController < ApplicationController

  # actions

  private

  def browser_game
    BrowserGame.new(self)
  end
end
class GamesController

如您所见,我正在将整个控制器传递给
BrowserGame#initialize
(这样我就可以处理会话和其他操作)。这是个好主意吗?由于控制器实例是一个大对象,是否有任何副作用?

是的,可以将大对象作为方法参数传递。您没有将对象放在堆栈上,只是一个指向它的指针。至于副作用——您从
浏览器游戏
中对
@controller
所做的任何操作都可以通过对控制器的任何其他引用来查看,但这可能是您已经预料到的。

传递大型对象没有问题

正如Darshan所说,它只是一个指针


如果您正在分叉进程/线程,或者试图创建一个延迟的作业在后台运行,那么最好只传递可序列化对象。

是的,这就是我所期望的。谢谢。这个答案令人困惑。变量是对对象的引用,无论您是“读取”还是“写入”(尽管您可以更改变量的引用内容)。如果您使用的是线程,您可能需要同步对对象的访问(使用互斥对象),但对象是否可序列化(不是所有的吗?)应该无关紧要。@pguard Oops,在我删除了对它的进一步细化后,将其保留在中。我正在考虑另一种语言。虽然传递大型对象是可以的,但您所做的(将控制器传递到模型中)似乎有点疯狂。这不是我以前见过的事。如果你能再解释一下你在用它做什么,我会感兴趣的。我正在实现一个游戏。因此,这意味着保持分数,交换玩家,在游戏结束后将其保存在数据库中。我之所以称它为
BrowserGame
,是因为它将所有内容都保存在会话中,最后保存到数据库中(该模型称为
Game
)。我选择了一个类来完成所有这些逻辑(
BrowserGame
)。之前,我在控制器中包含了一个模块,但这似乎不正确,因为模块本身不存在类似于
#session
的方法。我将控制器保存在一个实例变量中,我定义了
#method_missing
来委托给该控制器。我从“强参数”中得到了这个想法Railscast,否则我可能会留在模块里。