2014-11-21 2 views
0

Я разрабатываю простое приложение, которое повторно использовало некоторый код примера приложения знаменитого рельсового руководства Майкла Хартла. В частности, я повторно использую модель User, но переименовал ее как «Учетная запись». Я думаю, что я заменил все ссылки на модель User, но почему-то не могу заставить мой код работать. Вот мой код:Rails Tutorial: NameError в session_helper

class Account < ActiveRecord::Base 
include Person 
include Contact 
has_many :coworkers, :class_name => 'Coworker' 
has_many :customers, :class_name => 'Customer' 
has_many :locations, :class_name => 'Location' 
has_many :appointment_types, :class_name => 'AppointmentType' 
before_save { self.email = email.downcase } 
has_secure_password 
attr_accessor :remember_token 
validates :password, length: { minimum: 6 } 
# rem_notice_hrs 
validates :rem_notice_hrs, presence: true 
validates :rem_notice_hrs, numericality: true 
# rem_text 
validates :rem_text, presence: true 
# mandatory email: 
validates :email, presence: true, length: { maximum: 255 }, 
     format: { with: VALID_EMAIL_REGEX } 

after_initialize :init 

private 

def init 
    if self.new_record? 
    if self.rem_notice_hrs.nil? 
     self.rem_notice_hrs = 24 
    end 
    if self.rem_text.nil? 
     if self.company.nil? 
     self.rem_text = "Dear [customer title: automatic] [customer family name: automatic], this is a reminder of your appointment with %{title} %{family_name} on [date/time]." 
     else 
     self.rem_text = "Dear [title] [customer family name], this is a reminder of your appointment with %{company} on [date/time]." 
     end 
    end 
    if self.start_day.nil? 
     self.start_day = Time.now 
    end 
    end 
end 
end 

Здесь помощник Session:

module SessionsHelper 

# Logs in the given user. 
def log_in(account) 
session[:account_id] = account.id 
end 

# Returns the current logged-in user (if any). 
def current_account 
@current_account ||= Аccount.find_by(id: session[:account_id]) 
end 

# Returns true if the user is logged in, false otherwise. 
def logged_in? 
!current_account.nil? 
end 
end 

Вот заголовок парциальное:

<header class="navbar navbar-default navbar-fixed-top"> 
<div class="container"> 
<a class="navbar-brand" href=<%= root_path %>><font color="red">Sample Application<sup>&reg;</sup></font></a> 
<nav> 
    <ul class="nav navbar-nav"> 
    <% if logged_in? %> 
    <% else %> 
     <li class="active"><a href=<%= root_path %>>Home</a></li> 
     <li><a href=<%= demo_path %>>Try Demo</a></li> 
     <li><a href=<%= pricing_path %>>Pricing &amp; Sign up</a></li> 
     <li><a href="#login">Login</a></li> 
    <% end %> 
    </ul> 
</nav> 
</div> 
</header> 

Когда я запускаю код, который я получаю

NameError in StaticPages#home 
Showing /Users/nnikolo/Documents/private/rails_projects/appmate/app/views/layouts/_header.html.erb where line #6 raised: 

undefined local variable or method `Аccount' for #<#<Class:0x007fbc1ede96f8>:0x007fbc1ede8b18> 
app/helpers/sessions_helper.rb:10:in `current_account' 
app/helpers/sessions_helper.rb:15:in `logged_in?' 
app/views/layouts/_header.html.erb:6:in `_app_views_layouts__header_html_erb___3728230762564015047_70222988074560' 
app/views/layouts/application.html.erb:20:in `_app_views_layouts_application_html_erb___3720454973504965845_70222923917160' 

Другими словами, по какой-либо причине Sess ионный помощник не может распознать класс Account. Тот же код в учебном пособии работает, когда учетная запись заменяется на пользователя.

Интересно, что когда я решил включить модель счета в SessionsHelper (который я не нужно делать, но я сделал это только в качестве эксперимента) я получаю

wrong argument type Class (expected Module) 

Вы можете найти более подробную информацию в этом Скриншот:

enter image description here

В чем проблема? Почему SessionSelper не видит модель учетной записи? Фактически, он не может видеть ни одну из моделей - я заменил «включить учетную запись» на «включить напоминание» (еще одна модель ActiveRecord у меня есть), и я получаю то же сообщение об ошибке. Все модели должны быть видны помощнику - почему это не так?

P.S. Я побежал миграцию, и я не думаю, что проблема есть, но вот соответствующий раздел schema.rb:

create_table "accounts", force: true do |t| 
    t.string "password_digest",        null: false 
    t.string "remember_digest" 
    t.string "activation_digest" 
    t.boolean "activated",      default: false 
    t.datetime "activated_at" 
    t.string "title" 
    t.string "first_name" 
    t.string "last_name" 
    t.string "company" 
    t.string "email",    limit: 100,     null: false 
    t.integer "phone",    limit: 8,     null: false 
    t.integer "rem_notice_hrs",        null: false 
    t.string "rem_text",   limit: 140,     null: false 
    t.datetime "start_day",          null: false 
    t.datetime "end_day" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

ответ

0

В итоге я назвал «Учетную запись» как «Пользователь». Сейчас все работает. Все еще не знаю, что случилось. Похоже, что есть какое-то волшебство рельсов, связанное с именем «Пользователь».

0

Из того, что мне кажется, или у вас нету изменила миграцию с учетом счета или у вас нету выполните миграцию для этого файла. Пожалуйста, поделитесь содержимым вашего файла schema.rb.

+0

Спасибо за ваш ответ - просто сделал это – Nick

0

Account - класс.
SessionsHelper - это модуль.

Вы не можете включатьAccount в SessionsHelper, потому что класс не может быть смешанного в модуле. Это наоборот.

Вот почему вы получаете этот TypeError на StaticPages#home.