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
重新写入即可。
我正在尝试为 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
重新写入即可。