Rails, JWT: почему current_user вызывается / выполняется так часто, как это указано в шаблоне erb? - PullRequest
0 голосов
/ 22 марта 2019

application_conroller.rb

def current_user
    p 'current_user'
    user = decode_jwt(cookies.permanent[:jwt_token]
    @current_user ||= user
end

тогда у меня есть some.html.erb

<%=current_user.id%>
<%=current_user.first_name %>
<%=current_user.last_name %>

Затем мой журнал распечатывает

"current_user"
"current_user"
"current_user"

Кажетсявсякий раз, когда я вызываю current_user внутри html, он буквально проходит через то, что указано в current_user.

Я начинаю испытывать это, переключаясь с обычного подхода rails на JWT.Определенно эта ситуация в конечном итоге замедляет запрос.Что будет хорошей практикой, чтобы избежать ненужного выполнения current_user?

Ответы [ 2 ]

0 голосов
/ 22 марта 2019
def current_user
  p 'current_user'
  user = decode_jwt(cookies.permanent[:jwt_token]
  @current_user ||= user
end

Это метод.Когда вы набираете current_user, он вызывает метод и выполняет его.Если вы хотите вывести переменную, используйте ту, которую вы делаете @current_user, или установите новую переменную в контроллере: @user = current_user и измените ваше представление на:

<%=@user.id%>
<%=@user.first_name %>
<%=@user.last_name %>

Я начинаю испытывать это, переключаясь с обычного рельсового подхода на JWT.Определенно, эта ситуация приводит к замедлению запроса.

По своей природе JWT чувствует, что они делают больше запросов на аутентификацию, потому что каждый запрос требует проверки токена в вашем коде.Но в действительности сеансы выполняют почти одинаковую работу и требуют хранения данных на стороне сервера, тогда как JWT хранит их на стороне клиента.Кроме того, если ваша функция decode_jwt значительно замедляет работу сервера из-за трех дополнительных вызовов, вы можете просмотреть ее.

0 голосов
/ 22 марта 2019

Когда вы говорите <%= current_user.id %> по вашему мнению, вы вызываете метод current_user, а затем вызываете метод id для возвращаемого значения.Затем вы говорите <%= current_user.first_name %>, что вызывает current_user (снова), а затем вызывается first_name для того, что возвращается.И так далее.Нет ничего, что автоматически распознало бы, что вы вызываете один и тот же метод, чтобы получить то же возвращаемое значение, а затем оптимизировать все это.

Вы пытаетесь запомнить current_user (обычная вещь) в концевашего метода:

@current_user ||= user

, но это не помогает, потому что, по-видимому, вся работа выполняется в decode_jwt(cookies.permanent[:jwt_token]), и вы делаете это каждый раз, независимо от того, что является @current_user.

Памятка обычно будет выглядеть примерно так:

@current_user ||= decode_jwt(cookies.permanent[:jwt_token])

, так что вы будете перекодировать JWT только один раз (то есть, когда @current_user.nil?), а затем повторно использовать его.

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