Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.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,我的印象显然是错误的,当我将散列传递给类时,该类需要如下初始化方法: class Dog attr_reader :sound def initialize(params = {}) @sound = params[:sound] end end dog = Dog.new({sound:"woof"}) puts dog.sound 但我遇到了一些代码(用于创建密码摘要),这些代码在rails应用程序中工作,它不使用初始化方法,似乎工作得很好,这让我有些困惑,因为

我的印象显然是错误的,当我将散列传递给类时,该类需要如下初始化方法:

class Dog

  attr_reader :sound

  def initialize(params = {})
    @sound = params[:sound]
  end

end

dog = Dog.new({sound:"woof"})
puts dog.sound
但我遇到了一些代码(用于创建密码摘要),这些代码在rails应用程序中工作,它不使用初始化方法,似乎工作得很好,这让我有些困惑,因为当我在其他地方尝试时,它似乎不工作。下面是工作的示例代码(允许我传入哈希并在没有初始化方法的情况下进行初始化):

我得到的错误是:

参数数目错误(1代表0)


是rails允许我像这样传递散列还是ActiveRecord?我不明白为什么它在这个上下文中在rails中工作,但在rails之外生成错误。为什么在rails中可以这样做?

当您将ActiveRecord::Base子类化时,会发生很多事情。在讨论其他问题之前,我猜Dog是rails ActiveRecord模型,而您只是忘记添加了

class Dog < ActiveRecord::Base
classdog
如果你看顶部,你会发现:

class Dog < ActiveRecord::Base
在类对象上调用一个方法,然后该方法返回该类的实例

以你为例

class Dog

  attr_reader :sound

  def sound=(pwd)
    @sound = pwd
  end

  def self.create data_hash
   new_dog = self.new #create new instance of dog class
   new_dog.sound = data_hash[:sound] #set instance of dog classes sound
   new_dog # return instance of dog class
  end

end
它本质上就是我们所说的工厂方法,一种接收数据并基于该数据返回对象的方法

现在我毫不怀疑,
ActiveRecord::Base
正在做比这更复杂的事情,但这基本上就是它在最基本的级别上所做的事情

我还想指出,当从
ActiveRecord::Base
继承时,您也继承了它的'initialize'方法,所以您不必自己设置一个。
该类知道要根据您在为匹配(通过rail的约定)该类的表执行DB迁移时设置的模式创建什么属性方法。

与我的想法差不多,我只是想获得第二个意见。谢谢
class Dog < ActiveRecord::Base
Dog.create(password: 'some_password', username: 'some_username')
class Dog

  attr_reader :sound

  def sound=(pwd)
    @sound = pwd
  end

  def self.create data_hash
   new_dog = self.new #create new instance of dog class
   new_dog.sound = data_hash[:sound] #set instance of dog classes sound
   new_dog # return instance of dog class
  end

end