[英]Understanding class variables and methods in Ruby on Rails
我是Ruby和Ruby on Rails的新手,来自C语言的背景。
这是我在application_controller.rb
文件中找到的一些代码:
def current_user
@current_user ||= Renter.find(session[:user_id]) if session[:user_id]
end
helper_method :current_user
def authorize_user
redirect_to '/login' unless current_user
end
这是我不明白的事情:
- 第4行是:current_user
调用current_user
实例方法,还是直接访问@current_user
实例变量?
- 在第7行, current_user
是调用current_user
实例方法,还是直接访问@current_user
实例变量?
- 在第2行,是:user_id
是变量还是更像是用作键的字符串文字? 有点像在JavaScript中,可能会编写session["user_id"]
来获取session
对象的user_id
属性。
类方法在此示例中不相关 - 它们未在此处使用。
实例变量在获取/设置时永远不会调用方法。
虽然有时会发生相反的情况。 为实例变量创建getter / setter方法是一种非常常见的模式,因此常见的是在ruby核心中定义了attr reader / writer / accessor helper。 如果你写attr_accessor :foo
,那么foo=
和foo
将得到/设置实例变量。
但默认情况下不会发生这种情况。
回答你的另一个问题:
符号:user_id
以冒号开头,类似于字符串。 符号和字符串之间的区别可能看起来是随意的,但它在Ruby中是一个重要的概念,并且在您的脑海中区分是一个好主意。
回复你的评论:
第4行, helper_method :current_user
实际上是rails特有的东西,如果你愿意,可以认为它是“rails magic”。 实际上,这使得您的current_user
方法可以从视图中调用(而默认情况下,它只能在控制器中使用)。 :current_user
是一个用于引用current_user
方法的符号。 您不一定要详细了解一些helper_method
只需知道helper_method
采用与方法同名的符号并使该方法可用于视图就足够了。 据我所知,它只与Rails控制器有关。
在Ruby中使用引用方法名称的符号有点常见。 这是一个更中间的概念。 您可以在send
看到另一个示例:
def asd
return 0
end
class Foo
def instance_method_bar
return 0
end
def self.class_method_bar
return 0
end
end
# how the methods are typically called
asd
Foo.new.instance_method_bar
Foo.class_method_bar
# another way to call them, using send
send(:asd)
Foo.new.send(:instance_method_bar)
Foo.send(:class_method_bar)
除非你需要,我不建议你使用send
,但希望它会更清楚如何在helper_method
中使用符号:current_user
第7行是被调用的current_user
方法。
让我们一次解决一个问题。
在第4行, :current_user
是一种方法,很可能用于返回current_user
,因此您可以访问username
, email
或用户拥有的任何值。
在第7行,它仍然是相同的方法。 在这种情况下,Ruby正在检查current_user
对象是否存在。 unless
if not
, unless
你可以想到。 因此,如果current_user为false,代码将重定向到登录,如果current_user == nil
,则会发生这种情况。 如果用户已登录,则current_user != nil
,并且不会发生重定向。
在第2行, :user_id
是一个符号, session
是一个哈希值,它是键值对,例如{a:1,b:2},你可以使用[]
方法使用键访问该值,所以session[:user_id]
返回session[:user_id]
的值。 在Ruby中,你可以使用任何东西作为键,使用符号因为它们总是唯一的,对象id为:two
和:two
是相同的,而id对于“two”和“two”是不同的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.