Почему я получаю сообщение об ошибке Неопределенный метод `name'для nil:NilClass с Ruby on Rails?
Я думал, что методы, такие как имя и адрес электронной почты были по умолчанию в рельсах?
В моем статическом представлении страниц, в profile.html.erb у меня есть:
<% if logged_in? %>
<% provide(:title, @user.name) %>
<% else %>
<% provide(:title, 'Profile')%>
<% end %>
Я вставил в мой static_page_controller
def profile
@user = User.find_by_remember_token(:remember_token)
end
Когда я захожу в консоль User.find_by_remember_token("actualtoken"). Name возвращает мне соответствующее имя пользователя, но: Remember_token - нет. Как мне сделать: Remember_token = авторизованные пользователи помнят токен?
В моих сессиях_помощник у меня есть
def log_in(user)
cookies.permanent[:remember_token] = user.remember_token
current_user = user
end
def logged_in?
!current_user.nil?
end
def current_user=(user)
@current_user = user
end
def current_user
@current_user ||= user_from_remember_token
end
def log_out
current_user = nil
cookies.delete(:remember_token)
end
private
def user_from_remember_token
remember_token = cookies[:remember_token]
User.find_by_remember_token(remember_token) unless remember_token.nil?
end
end
копирование его в мой static_pages_helper ничего не дало.
2 ответа
Быстрые вещи, которые вы должны знать о структуре рельсов и языке ruby:
- Функция, определенная в любом из ваших помощников, будет доступна всем помощникам и представлениям (поэтому нет причин копировать и вставлять одни и те же функции через разных помощников);
- Вы, вероятно, используете драгоценный камень аутентификации, и я предполагаю, что это драгоценный камень Devise. Если это правильно, то вам не следует переопределять их помощников, если у вас нет причин для этого;
User.anything
будет вызывать статическую функцию как угодно из класса User;user = User.find_by_anything(the_thing)
является статическим помощником класса, предоставленным ActiveModel, который будет запрашивать базу данных, ища пользователя, у которого есть *any = the_thing*; этот пользователь или ноль будут возвращены;user.an_attribute
вызовет функцию, которая возвращает указанный пользователем атрибут (который по умолчанию совпадает с именем столбца этого атрибута);user.try(:anything)
постарается вызвать функцию что угодно от пользователя и вернуть ее значение. Если пользователь nil, возвращаемое значение также будет nil.
Тем не менее, я думаю, вы просто хотели получить токен запоминания текущего пользователя, что можно сделать с помощью следующего:
user = current_user.try(:remember_token)
Отредактировано: вопрос немного запутанный, но я также думаю, что следующий код будет работать с вашим контроллером:
def profile
@user = User.find_by_remember_token(params[:remember_token])
end
Вы должны получить доступ к параметрам запроса через хэш params.
РЕДАКТИРОВАТЬ: полностью заменяет мой первый ответ одним, надеюсь, не так глупо:-)
(Хотя существует несколько способов реализации и управления сессиями в Rails, по умолчанию используется cookie в браузере для ссылки на ключ, хранящийся в памяти. Сессии создаются по запросу из браузера, поэтому, безусловно, можно использовать консоль для получить на существующей сессии, это, вероятно, не то, что вы хотите.)
Таким образом, ваш метод user_from_remember_token либо возвращает пользователя, либо nil. То, что я не вижу в вашем коде, это то, где вы настраиваете запоминание для модели User. Я предполагаю, что это там, но вы можете захотеть иметь код, который говорит пользователю, чтобы войти, если вы не найдете их. Общий шаблон будет
def current_user
@current_user ||= user_from remember_token
unless @current_user
flash[:notice] = "Yo! Log in first."
redirect_to login_path and return
end
end
Нет проблем с вызовом искателя модели из отдельного контроллера. Но зачем звонить User.find_by_remember_token(:remember_token)
- у вас еще нет запоминаемого токена (верно?). Разве ты не хочешь просто позвонить current_user
метод в ваших сессиях помощник?
Если метод не виден, вы можете включить или потребовать помощника сеанса в вашем application_controller.rb