Вспомогательные методы Rails: @ vs нормальная переменная - PullRequest
0 голосов
/ 01 июня 2018

В уроке Майкла Хартла у нас есть метод 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_methods используют обычный variable_names). (Я предполагаю, что @current_user был просто удобен)

Ответы [ 4 ]

0 голосов
/ 01 июня 2018

Например, если мы используем 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

Side Note

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

Этот шаблон называется памятованием,Это очень распространенный шаблон в Ruby / Rails.Подробнее об этом можно прочитать здесь:

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

0 голосов
/ 01 июня 2018

Вот общая идиома Ruby:

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

Вы можете звонить current_user так часто, как вам хочется, сейчас, потому что она потратит время на попадание в базу данных при первом вызове.,При последующих вызовах @current_user имеет значение, поэтому ||= оценивается тривиально как @current_user = @current_user.

Эффект длится до тех пор, пока существует экземпляр @.Если это контроллер, он будет действовать для текущего действия, а затем исчезнет.Это означает, что новое действие с другим пользователем не сработает по сравнению с предыдущим значением @current_user.

Поскольку def current_user занимает пространство имен, отличное от @current_user, идиома Ruby должна называть "шаблон памяти""переменная так же, как метод, который она оптимизирует.

Ваш пример делает шаблон памятки немного запутанным, потому что есть два способа генерирования текущего пользователя.

0 голосов
/ 01 июня 2018

Вы можете вернуть обычную переменную в вспомогательных методах.

@ - это просто синтаксис, используемый для определения переменной экземпляра.

@current_user - это просто соглашение, вы можете использовать любоеимя как @whatever_user

0 голосов
/ 01 июня 2018

@ делает переменные доступными по всему классу.

Если бы было просто current_user вместо @current_user, оно было бы доступно только внутри этого конкретного метода.

Вы можете использовать current_user в качестве имени переменной внутри метода с именем current_user


, вам не нужно использовать @ перед переменной экземпляра для возвратазначение.

def some_method
  user = "Jimmy"
  user
end

> puts some_method
"Jimmy"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...