Учебник Майкла Харта по Rails: неопределенная локальная переменная или метод 'id'

Я в конце раздела 9.4.3, после изменения ссылок заголовка, когда вы вошли и вышли. Когда я пытаюсь загрузить любую страницу, я получаю ту же ошибку:

Showing C:/Sites/sample_app/app/views/layouts/_header.html.erb where line #7 raised:
undefined local variable or method `id' for #<Class:0x5cbd658>

Extracted source (around line #7):
4:  <nav class="round">
5:      <ul>
6:          <li><%= link_to "Home", root_path %></li>
7:          <% if signed_in? %>
8:              <li><%= link_to "Profile", current_user %></li>
9:          <% end %>
10:             <li><%= link_to "Help", help_path %></li>

След включения шаблона: app/views/layouts/application.html.erb

Rails.root: C:/Sites/sample_app Трассировка приложения | трассировка фреймворка | Полная трассировка

app/models/user.rb:47:in `authenticate_with_salt'
app/helpers/sessions_helper.rb:26:in `user_from_remember_token'
app/helpers/sessions_helper.rb:12:in `current_user'
app/helpers/sessions_helper.rb:16:in `signed_in?'
app/views/layouts/_header.html.erb:7:in `_app_views_layouts__header_html_erb__376347676_36919992'
app/views/layouts/application.html.erb:10:in `_app_views_layouts_application_html_erb___333215577_32850792'

Вот мой файл session_helper.rb:

module SessionsHelper
def sign_in(user)
    cookies.permanent.signed[:remember_token] = [user.id, user.salt]
    current_user = user
end

def current_user=(user)
    @current_user = user
end

def current_user
    @current_user ||= user_from_remember_token
end

def signed_in?
    !current_user.nil?
end

def sign_out
    cookies.delete(:remember_token)
    current_user = nil
end

private
    def user_from_remember_token
        User.authenticate_with_salt(*remember_token)
    end

    def remember_token
        cookies.signed[:remember_token] || [nil, nil]
    end
end

Я также сверил свой код с тем, что находится на Github, но не могу понять, что я делаю неправильно.


person Jarred    schedule 14.11.2011    source источник
comment
Пожалуйста, покажите нам свою модель User, где-то в строке 47.   -  person Ryan Bigg    schedule 15.11.2011
comment
Вот мой файл user.rb: pastebin.com/Jw409Uah   -  person Jarred    schedule 15.11.2011


Ответы (1)


Вы, вероятно, просто сделали ошибку копирования-вставки. Строка 46 вашего user.rb должна выглядеть так:

def self.authenticate_with_salt(id, cookie_salt)
  user = find_by_id(id)
  (user && user.salt == cookie_salt) ? user : nil
end

Используемые вами параметры взяты из метода класса User.authenticate.

(Кроме того, пожалуйста, не используйте вкладки, это плохой стиль Ruby.)

person iain    schedule 14.11.2011
comment
Вы правы, я передал этой функции неправильные имена параметров. Спасибо! - person Jarred; 15.11.2011