Почему я получаю сообщение об ошибке Неопределенный метод `name 'для nil: NilClass с Ruby on Rails? - PullRequest
2 голосов
/ 21 марта 2012

Я думал, что методы, такие как имя и адрес электронной почты, были по умолчанию в рельсах?

В моем статическом представлении страниц в 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 ]

2 голосов
/ 21 марта 2012

Быстрые вещи, которые вы должны знать о структуре rails и языке ruby:

  • Функция, определенная в любом из ваших помощников, будет доступна всем помощникам и представлениям (поэтому нет причин длякопировать и вставлять одни и те же функции через разных помощников);
  • Вы, вероятно, используете гем аутентификации, и я полагаю, что это гем Devise.Если это правильно, то вам не следует переопределять их помощников, если у вас нет причин для этого;
  • User.anything вызовет статическую функцию что-нибудь из класса User;
  • user = User.find_by_anything(the_thing) - это статический помощник класса, предоставляемый ActiveModel, который будет запрашивать базу данных в поисках пользователя, у которого есть * any = the_thing *;этот пользователь или nil будет возвращен;
  • user.an_attribute вызовет функцию, которая возвращает указанный пользователем атрибут (который по умолчанию совпадает с именем столбца этого атрибута);
  • user.try(:anything) будет пытаться вызвать функцию что угодно от пользователя и вернуть ее значение.Если user равен nil, возвращаемое значение также будет равно nil.

Тем не менее, я думаю, вы просто хотели получить токен запоминания текущего пользователя, что может быть выполнено с помощью следующего:

user = current_user.try(:remember_token)

РЕДАКТИРОВАНИЕ: Вопрос немного запутанный, но я также думаю, что следующий код будет работать с вашим контроллером:

def profile
  @user = User.find_by_remember_token(params[:remember_token])
end

Вы должны получить доступ к параметрам запроса черезхэш параметров.

1 голос
/ 21 марта 2012

РЕДАКТИРОВАТЬ: полностью заменяет мой первый ответ одним, надеюсь, не так глупо: -)

(Хотя существует несколько способов реализации и управления сеансами в 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

...