Rails Devise - current_user is nil - программирование
Подтвердить что ты не робот

Rails Devise - current_user is nil

По какой-то причине current_user возвращает nil в моем контроллере без модели (Subscriptions). Я ничего не нашел в Интернете, чтобы оправдать это поведение...

class SubscriptionsController < ApplicationController  
  def new
    ...
  end

  def create
    current_user    # returns nil
  end
end

У меня есть метатег csrf:

<meta content="xxx" name="csrf-token">

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

UPDATE

Итак, благодаря комментариям/ответам, я поставил задачу на одно конкретное действие: create.

если я добавлю @user = current_user в new, я могу показать текущую электронную почту пользователя в моем представлении new. Однако в моем контроллере create current_user возвращает nil.

Я обратился к действию create через форму (отправить).

Перед отправкой формы я проверяю ввод и затем отправляю запрос на Stripe, чтобы получить токен из формы. Если ошибок нет (валидация и полоса), я затем отправляю форму.

Может ли быть причиной?

ОБНОВЛЕНИЕ 2

В моем сообщении об ошибке мой дамп сеанса пустой, в то время как он должен содержать информацию current_user...

4b9b3361

Ответ 1

Оказалось, что запрос AJAX, который я делал, не имел токен CSRF. По этой причине Rails убивал мою сессию.

Я добавил skip_before_filter :verify_authenticity_token в мой SubscriptionsController, и теперь он работает. Это может быть не самое безопасное решение, но сейчас оно работает, поэтому я продолжаю развиваться и возвращаться к этой проблеме позже.

Ответ 2

Обратите внимание, что при создании форм с помощью помощника form_tag они автоматически не генерируют скрытое поле, которое содержит токен для аутентификации CSRF. Я столкнулся с этой же проблемой с формой, которую я построил, используя form_tag, который я иногда предпочитаю использовать.

Я исправил проблему, включив в форму следующие помощники:

<%= hidden_field_tag 'authenticity_token', form_authenticity_token %>

Это в основном ручной способ создания скрытого поля, необходимого для материала CSRF.

Ответ 3

для current_user для работы вам нужно добавить before_filter :authenticate_user! в свой класс, например:

class SubscriptionsController < ApplicationController  
  before_filter :authenticate_user!

  def new
    ...
  end

  def create
    curent_user    # returns nil
  end
end

а метод authenticate_user! установит для вас текущего пользователя:)

Ответ 4

У меня была похожая проблема, но я редактировал модель. Поэтому каждый раз, когда я обновлял модель внезапно, это происходило:

current_model to nil

После анализа вещей выясняется, что если вы оставите пароль в форме, когда пользователь попытается изменить какой-либо атрибут, он будет вынужден написать пароль.
Как только форма доставлена и обновлена, Devise делает разумную вещь, когда кто-то обновляет пароль, то есть уничтожает сеанс и просит пользователя снова войти в систему.

Вот почему current_model внезапно обернулся нулем. Надеюсь, это поможет, хорошего дня!