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...
Ответы
Ответ 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
внезапно обернулся нулем. Надеюсь, это поможет, хорошего дня!