Sinatra:“/route”处的 NameError,未定义的局部变量或方法

Sinatra: NameError at '/route', undefined local variable or method

我正在尝试为 cms 网站构建管理后端。

这是我的应用程序的结构

├── 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:password@localhost/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

我在 routes.rb

中定义了一条 categories 路线
...
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 中的 require 序列),因为在 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

更新

我正在使用相同的方法列出其他 table/models,并且它们都按我的预期工作,但类别不同。

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>

不知何故,您的源代码中出现了一个奇怪的字符。这不是 <%= с.posts.count %> 行中的“正常”拉丁语 c,而是 U+0441, CYRILLIC SMALL LETTER ES。它看起来像拉丁语 c.

要修复它,只需删除字符并用正常的 c 重新写入即可。