请不要过于严厉地评价我,因为我对这个话题很新,我不知道如何提问(或者搜索什么来获得答案):
我正在学习Sinatra中的嵌套表单,但遇到了一些我不理解的与Ruby相关的内容。
请参阅下面的代码段 - 尝试在rake console
中测试代码时,我输入了Team
,并且惊讶地看到使用名称“Team”创建的对象。但是,如果我输入my_team = Team.new(params)
,我会收到undefined local variable or method 'params' for main:Object
如果我输入其他任何内容,请说“男人”,我会NameError: undefined local variable or method 'man' for main:Object
为什么类的名称会导致类的实例?它不应该Class_name.new
创建一个对象吗?
class Team
attr_accessor :name
TEAM = []
def initialize(params)
@name = params[:team][:name]
TEAM << self
end
def self.all
TEAM
end
end
答案 0 :(得分:2)
在Ruby中,一切都是对象,因此类是对象(它们是类Class的实例。
Team
是类Class的实例(缩写为“a class”),而Team.new
构建Team
的实例。类的实例具有某种行为,允许通过方法#new
创建自己的实例。
现在,传递给ruby中方法的任何参数都必须在当前binding中定义,这意味着如果params
未定义,则不允许您立即执行Team.new(params)
。在访问之前定义局部变量(将进入绑定)很容易:
params = { team: { name: 'StackOverflow' } }
Team.new(params)
会奏效。
答案 1 :(得分:1)
我将该代码段加载到irb中,Team
不会返回类Team
的实例。
实例化params
时传入的参数(Team
)必须是某种东西;如果params
当前不是分配给对象的局部变量,则ruby将拒绝实例化Team
。
当您使用Rails或Sinatra等框架时,params
是客户端(您的浏览器)在HTTP请求中发送到您的应用程序的哈希值。在这种情况下,当params哈希命中您的应用程序时,它看起来像:
{:team => {:name => "Team 1's name"}}
您的应用中可能发生的情况是用户在浏览器中点击“创建团队”之类的按钮,输入该表单的数据(例如“团队名称”)会被放入params
哈希
如果您刚刚使用了自己提供的纯Ruby代码并且刚刚执行了Team.new(params)
,那么如果Team.new(nil)
未分配给任何内容,则相当于params
。< / p>
顺便说一下,这是一个相当酷的Ruby - 它允许你Team.all
返回一组先前创建的团队。
.all
是一种类方法。如果您想更多地了解类方法,我有一个little blog post on it。
希望这一切有帮助吗?如果你愿意,可以随意提出更多问题。