Почему я получаю сообщение об ошибке Неопределенный метод `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

Другие вопросы по тегам