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