2015-07-26 4 views
0

Я пытаюсь создать бэкэнд администратора для сайта cms.Sinatra: NameError at '/ route', неопределенная локальная переменная или метод

это структура моего приложения

├── app.rb 
├── Gemfile 
├── models 
│   └── models.rb 
├── routes 
│   └── routes.rb 
└── views 
    ├── categories.erb 
    ├── # ... other view files 

app.rb

require 'sinatra' 
require 'data_mapper' 
require 'dm-core' 
require 'dm-migrations' 
require 'digest' 

enable :sessions 

DataMapper.setup(:default, 'mysql://username:[email protected]/database') 
require './models/models.rb' 
require './routes/routes.rb' 
DataMapper.finalize 

models.rb

class Category 
    include DataMapper::Resource 

    property :id,   Serial 
    property :name,  String 

    has n, :posts 
end 
# other model definitons 

я определил categories маршрут внутри м у routes.rb

... 
get '/categories' do 
    @categories = Category.all 
    erb :categories 
end 
... 

Содержание зрения (categories.erb) файла.

   #table headers 
       <tbody> 
       <% @categories.each do |c| %> 
        <tr> 
         <td> 
          <%= c.id %> 
         </td> 
         <td> 
          <%= c.name %> 
         </td> 
         <td> 
          <%= с.posts.count %> 
         </td> 
         <td> 
          <%= c.posts(:order => [:updated_at.desc]).first.updated_at.strftime("%d/%m/%Y") %> 
         </td> 
        </tr> 
       <% end %> 
       </tbody> 

Когда я просматриваю к /categories маршруту, сервер плюет эту ошибку

NameError at /categories 
undefined local variable or method `с' for #<Sinatra::Application:0x0000000284bc08> 

Я не сталкивался с такой проблемой раньше. И действительно не знаю, что происходит.

Проблема, вероятно, связана не с структурой приложения (требуемые последовательности внутри app.rb), поскольку до get '/categories' Я определил маршрут post '/login', который проверяет входные данные пользователя в отношении записей базы данных. И он работает так, как я хочу.

post '/login' do 
    email = params[:email] 
    pwd = params[:password] 

    user = Author.first(:email=>email) 

    if user.nil? 
     redirect to ('/register') 
    elsif !user.nil? 
     if Digest::MD5.hexdigest(pwd) == user.password 
     ... #and so on 

UPDATE

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

other routes 
get '/articles' do 
    @articles = Post.all(:is_blog_post => false) 
    erb :site_articles 
end 
##blog articles 
get '/blogposts' do 
    @barticles = Post.all(:is_blog_post => true) 
    erb :blog_articles 
end 
#users 
get '/admin_users' do 
    @admins = Author.all(:is_admin=>true) 
    erb :admin_users 
end 

#bloggers 
get '/bloggers' do 
    @bloggers = Author.all(:is_admin=>false) 
    erb :blog_users 
end 

и соответствующий просмотр файлов сайт статьи

  <tbody> 
      <% @articles.each do |art| %> 
       <tr> 
        <td> 
         <%= art.title %> 
        </td> 
        <td> 
         <%= art.author.full_name %> 
        </td> 
        <td> 
         <%= art.category.name %> 
        </td> 
        <td> 
         <%= art.updated_at.strftime("%d/%m/%Y %H:%M") %> 
        </td> 
        <td> 
         <%= art.featured? ? "Yes" : "No" %> 
        </td> 
       </tr> 
       <% end %> 
      </tbody> 

блог статьи

  <tbody> 
      <% @barticles.each do |art| %> 
       <tr> 
        <td> 
         <%= art.title %> 
        </td> 
        <td> 
         <%= art.author.full_name %> 
        </td> 
        <td> 
         <%= art.category.name %> 
        </td> 
        <td> 
         <%= art.updated_at.strftime("%d/%m/%Y %H:%M") %> 
        </td> 
        <td> 
         <%= art.featured? ? "Yes" : "No" %> 
        </td> 
       </tr> 
       <% end %> 
      </tbody> 

админы

  <tbody> 
      <% @admins.each do |admin| %> 
       <tr> 
        <td> 
         <%= admin.full_name %> 
        </td> 
        <td> 
         <%= admin.email %> 
        </td> 
        <td> 
         <%= !admin.twitter.nil? ? admin.twitter : "N/A" %> 
        </td> 
        <td> 
         <%= !admin.facebook.nil? ? admin.facebook : "N/A" %> 
        </td> 
        <td> 
         <%= !admin.phone.nil? ? admin.phone : "N/A" %> 
        </td> 
        <td> 
         <%= admin.posts.count %> 
        </td> 
       </tr> 
       <% end %> 
      </tbody> 

блоггеры

   <tbody> 
       <% @bloggers.each do |blogger| %> 
        <tr> 
         <td> 
          <%= blogger.full_name %> 
         </td> 
         <td> 
          <%= blogger.email %> 
         </td> 
         <td> 
          <%= !blogger.twitter.nil? ? blogger.twitter : "N/A" %> 
         </td> 
         <td> 
          <%= !blogger.facebook.nil? ? blogger.facebook : "N/A" %> 
         </td> 
         <td> 
          <%= !blogger.phone.nil? ? blogger.phone : "N/A" %> 
         </td> 
         <td> 
          <%= blogger.posts.count %> 
         </td> 
        </tr> 
        <% end %> 
       </tbody> 
+0

Он дает номер строки? – thesecretmaster

+0

yes, 'file: categories.erb location: block (2 levels) в строке singleton class: 28', что соответствует' <% = с.posts.count%> ' . Интересно, я могу перечислить пользователей с тот же метод внутри другого файла представления, но при попытке перечислить категории, программа выйдет из строя. вывода для того же сценария '> c.posts.count (# в новой строке) => 3' – marmeladze

+0

Попробуйте запустить в терминале 'irb app.rb', а затем попробуйте команду' var = Catagories.all.posts'. Затем попробуйте 'var.count'. Скажите, пожалуйста, что произойдет – thesecretmaster

ответ

5

Вы каким-то образом получил странный характер в источнике. Это не «нормальный» латинский c в строке <%= с.posts.count %>, это U+0441, CYRILLIC SMALL LETTER ES. Он просто выглядит как латинский c.

Чтобы исправить это, просто удалите символ и перепишите его с нормальным c.

+0

awesome :) !!!! как вы это узнали? – marmeladze

+1

Я подумал, что что-то вроде этого может объяснить то, что вы видите, поэтому я скопировал строку в irb, а затем назвал «байты» на ней, чтобы проверить. Вы знаете, как это получилось - вы используете скрипт Cryillic в другом месте? – matt

+0

Да, когда мне нужно что-то писать по-русски, я использую кириллицу. и эта картина может объяснить ситуацию. http://winrus.com/std_ru.gif :) C и С использовать тот же ключ. – marmeladze

 Смежные вопросы

  • Нет связанных вопросов^_^