繁体   English   中英

理解Ruby on Rails中的类变量和方法

[英]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 ,因此您可以访问usernameemail或用户拥有的任何值。

  • 在第7行,它仍然是相同的方法。 在这种情况下,Ruby正在检查current_user对象是否存在。 unless if notunless你可以想到。 因此,如果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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM