Как мне установить ‘current_user’, даже если пользователь не вошел в систему? — Rails 3

#ruby-on-rails-3 #devise

#ruby-on-rails-3 #разработка

Вопрос:

Я использую Devise для аутентификации, и когда кто-то посещает определенный URL (с определенными параметрами в URL), я хотел бы присвоить ‘current_user’ определенное значение из базы данных.

Как мне это сделать?

Кроме того, должен ли я убедиться, что все требования к проверке выполнены? Например, моя пользовательская модель имеет:

 validates_presence_of :username, :email
  

Если я установлю current_user, должен ли я установить оба:username amp;: email, или я могу просто сделать одно или другое?

Ответ №1:

Вы могли бы попробовать

 @user = User.where(:x => "y").first # Find the user depending on the params
sign_in(@user)
# do work
sign_out(@user)
  

Я не знаю, лучший ли это способ сделать это, но он установится current_user .

Комментарии:

1. Ну, дело в том, что, если @user я хочу установить, это не из модели User , а из другой модели Client , которая не управляется Devise? т. Е. у меня есть две модели. Users Модель и Clients model. У client A есть только адрес электронной почты. Нет имени пользователя, нет pw или чего-либо еще. Тогда как у user целых девять ярдов. Итак, я хотел бы переопределить user с помощью клиента, если существуют некоторые параметры.

2. Разработка наборов current_user , специфичных для пользователя. Я думаю, если у вас определены отношения пользователь-клиент, вы могли бы сделать что-то вроде sign_in(@client.user) , или ваш @user = User.where(:email => @client.email) нашел бы пользователя и затем зарегистрировал его.

3. Похоже, это не работает, если у вас есть клиент без файлов cookie

Ответ №2:

current_user помощник devise устанавливает переменную экземпляра @current_user, поэтому делает это:

 @current_user = User.first
  

также будет установлен current_user для выбранного пользователя.

Комментарии:

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