繁体   English   中英

Rails助手方法:@ vs正常变量

[英]Rails helper methods: @ vs normal variable

在Michael Hartl的rails教程中,我们定义了current_user方法,如下所示:

  # Returns the user corresponding to the remember token cookie.
  def current_user
    if (user_id = session[:user_id])
      @current_user ||= User.find_by(id: user_id)
    elsif (user_id = cookies.signed[:user_id])
      user = User.find_by(id: user_id)
      if user && user.authenticated?(:remember, cookies[:remember_token])
        log_in user
        @current_user = user
      end
    end
  end

起初,我假设需要@current_user而不是其他一些局部变量,例如the_current_user (假设您不能使用current_user因为这是方法的名称。)

使用返回某些内容的辅助方法时,我们需要@变量还是仅使用任何变量类型? (我看到其他helper_method使用普通的variable_names )。 (我假设@current_user只是方便)

@使变量在整个类中可用。

如果只是current_user而不是@current_user则只能在该特定方法内部访问。

您可以在名为current_user的方法内将current_user用作变量名。


您无需在实例变量返回值之前使用@

def some_method
  user = "Jimmy"
  user
end

> puts some_method
"Jimmy"

这是一个常见的Ruby习语,即将结束:

def current_user
  @current_user ||= User.find_by(id: something)
end

现在,您可以随意调用current_user ,因为它只会花时间在您第一次调用数据库时访问数据库。 在随后的调用中, @current_user有一个值,因此||= @current_user = @current_user@current_user = @current_user

只要@实例存在,效果就会持续。 如果是控制器,它将持续执行当前操作,然后消失。 这意味着使用其他用户执行的新操作不会超出@current_user的先前值。

由于def current_user占用的名称空间不同于@current_user ,因此Ruby惯用语是将“ memento pattern”变量命名为与其优化的方法相同的名称。

您的示例使备忘录模式有些混乱,因为生成当前用户有两种方法。

您可以在辅助方法中返回普通变量。

@只是用于定义实例变量的语法。

@current_user只是一个约定,您可以使用任何名称,例如@whatever_user

例如,如果我们使用current_user而不是@current_user则您将无法从任何视图访问current_user

例如,如果要显示用户名(如果用户已登录):

<%= @current_user.name if @current_user %>

仅因为我们使用了实例变量,才有可能。

以下内容将帮助您更多地了解实例变量:

https://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/instancevars.html http://ruby-for-beginners.rubymonstas.org/writing_classes/instance_variables.html

要了解Ruby中可用的所有变量类型: https : //www.studytonight.com/ruby/types-of-variables-in-ruby

边注

@current_user ||= User.find_by(id: user_id)

这种模式称为记忆。 这是Ruby / Rails中非常常见的模式。 你可以在这里读更多关于它的内容:

https://www.justinweiss.com/articles/4-simple-memoization-patterns-in-ruby-and-one-gem/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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