![](/img/trans.png)
[英]Instance Methods vs. Class methods For a Helper Class - Ruby, Rails
[英]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.