簡體   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