Sinatra:NoMethodError
Sinatra: NoMethodError
我想我在程序流程中有一个逻辑错误,returns NoMethodError
首先是一段出错的代码
<input id="#identity" type="number" name="journal[identity]" value="<%= @journal.identity unless @journal.identity.nil? %>" />
#Error Text
NoMethodError at /profile
undefined method `identity' for nil:NilClass
file: journal_form.erb location: block in singleton class line: 2
输入标签内的代码正是错误文本中描述的代码段。
我的程序流程就是这样。
- 用户登录
- 如果认证成功,he/she将被重定向到
/profile
页面
- 根据他们的 roles/privileges 他们会在“/profile”的主要区域中看到不同的内容。内容是数据库
1 可以。用户可以毫无问题地登录和注销。对于第二步,代码就是这样
#profile.erb
<% if session[:user].role == 1 %>
<%= erb :assign_doctor %>
<% elsif session[:user].role == 2 %>
<%= erb :journal_form %>
<% elsif session[:user].role == 3 %>
<pre>
Silence!
</pre>
<% elsif session[:user].role == 4 %>
<%= erb :doctor_screen %>
<% end %>
第二种情况下的 'journal_form.erb' 文件。
<input id="#identity" type="number" name="journal[identity]"
value="<%= @journal.identity unless @journal.identity.nil? %>" />
.... # some other attributes like that.
<% if session[:user].role == 1 %>
<% if journal.viewed == false %>
<input id="#assigned_doctor" type = "text" name="journal[assigned_doctor]" />
<% else %>
<input id="#assigned_doctor" type = "text" name="journal[assigned_doctor]" value="<%= @journal.assigned_doctor unless @journal.assigned_doctor.nil? %>" />
<% end %>
我还为 journal
模型条目(在其他文件中)创建了 CRUD 资源。并且在不对 profile
产生 CRUD 视图的情况下,它们工作正常。
也许问题是,profile
不知道传递给它的上下文,所以它会这样响应。但是不知道如何解决它。
如果你愿意,我可以添加更多代码。
总和:
当@journal == nil
为什么<%=@journal.identity unless @journal.identity.nil?%>
returnundefined method 'identity' for nil:NilClass
?
下面有一些有用的资源:
in user.rb(包含3个classes/models)与main.rb同目录。
# model declerations end here
DataMapper.finalize
module JournalHelpers
def find_journals
@journals = Journal.all
end
def find_journal
Journal.get(params[:id])
end
def create_journal
@journal = Journal.create(params[:journal])
end
end
helpers JournalHelpers
get '/journals' do
find_journals
erb :journals
end
#new
get '/journals/new' do
#protected!
@journal = Journal.new
erb :new_journal
end
#show
get '/journals/:id' do
@journal = find_journal
erb :show_journal
end
#create
post '/journals' do
#protected!
flash[:notice]= "Journal was succesfull posted" if create_journal
redirect to("/journals/#{@journal.id}")
end
#edit
get '/journals/:id/edit' do
#protected!
@journal = find_journal
erb :edit_journal
end
#put/update
put '/journals/:id' do
#protected!
journal = find_journal
if journal.update(params[:journal])
flash[:notice] = "Journal successfully updated"
end
redirect to("/journals/#{journal.id}")
end
程序结构
├── assets
│ ├── css
│ │ ├── application.css
│ │ ├── jquery-ui.min.css
│ │ └── main.css
│ ├── images
│ │ ├── loader.gif
│ │ └── nurse_shshsh.jpeg
│ └── js
│ ├── application.js
│ ├── jquery.min.js
│ └── jquery-ui.min.js
├── main.rb
├── user.rb
├── users.db
└── views
├── about.erb
├── assign_doctor.erb
├── contact.erb
├── doctor_screen.erb
├── edit_journal.erb
├── home.erb
├── journal_form.erb
├── journals.erb
├── layout.erb
├── leftcolumn.erb
├── login.erb
├── nav.erb
├── new_journal.erb
├── notifications.erb
├── profile.erb
└── show_journal.erb
正在检查日志是否为 nil。
get '/profile' do
if !authorized?
redirect to('/login')
else
puts "nihil" if @journal.nil?
erb :profile
end
end
服务器日志
127.0.0.1 - - [29/Jun/2015:22:35:33 +0500] "GET /profile HTTP/1.1" 302 - 0.0029
127.0.0.1 - - [29/Jun/2015:22:35:33 +0500] "GET /login HTTP/1.1" 200 212 0.0024
127.0.0.1 - - [29/Jun/2015:22:35:42 +0500] "POST /login HTTP/1.1" 303 - 0.0167
nihil
127.0.0.1 - - [29/Jun/2015:22:35:43 +0500] "GET /profile HTTP/1.1" 200 1047 0.0106
@journal 为零。
如果@journal 为零,@journal.identity 或@journal.almost_any_function 将引发错误。我想你真正想要的是:
<%=@journal.identity unless @journal.nil?%>
如评论中所述。或者#try定义在rails中,你可以这样做:
<%= @journal.try(:identity) %>
在@journal 本身为 nil 的情况下,它们都将 return nil 而不会引发 NoMethod 错误。如果定义了@journal,它将return @journal.identity
的值
正如我在评论中所述,最明显的解决方案是使用 <%= @journal.identity unless @journal.nil?%>
因为如果 @journal == nil
那么 @journal.nil?
将 return 为真,并且整个语句将return 无。当您 post 完整代码时,我将继续更新此答案。
在我看来,您的代码依赖于 @journal
字段集这一事实。 (这到底是谁的日记?)肯定不是在 main.rb
中设置的。您应该在 get '/profile'
块中获得所需的数据。大致如下:
get '/profile' do
if !authorized?
redirect to('/login')
else
@journal = Journal.get(params[:id])
erb :profile
end
end
有多种方法可以做到这一点。通常最好避免调用之间的任何共享状态,而是在每个特定请求中获取所有需要的数据。 (数据仍然可以像在您的 JournalHelper 模块中一样被重用。)如果数据库访问成为瓶颈,最好的方法通常是在数据库或 Web 服务器前面引入缓存。
我想我在程序流程中有一个逻辑错误,returns NoMethodError
首先是一段出错的代码
<input id="#identity" type="number" name="journal[identity]" value="<%= @journal.identity unless @journal.identity.nil? %>" />
#Error Text
NoMethodError at /profile
undefined method `identity' for nil:NilClass
file: journal_form.erb location: block in singleton class line: 2
输入标签内的代码正是错误文本中描述的代码段。
我的程序流程就是这样。
- 用户登录
- 如果认证成功,he/she将被重定向到
/profile
页面 - 根据他们的 roles/privileges 他们会在“/profile”的主要区域中看到不同的内容。内容是数据库
1 可以。用户可以毫无问题地登录和注销。对于第二步,代码就是这样
#profile.erb
<% if session[:user].role == 1 %>
<%= erb :assign_doctor %>
<% elsif session[:user].role == 2 %>
<%= erb :journal_form %>
<% elsif session[:user].role == 3 %>
<pre>
Silence!
</pre>
<% elsif session[:user].role == 4 %>
<%= erb :doctor_screen %>
<% end %>
第二种情况下的 'journal_form.erb' 文件。
<input id="#identity" type="number" name="journal[identity]"
value="<%= @journal.identity unless @journal.identity.nil? %>" />
.... # some other attributes like that.
<% if session[:user].role == 1 %>
<% if journal.viewed == false %>
<input id="#assigned_doctor" type = "text" name="journal[assigned_doctor]" />
<% else %>
<input id="#assigned_doctor" type = "text" name="journal[assigned_doctor]" value="<%= @journal.assigned_doctor unless @journal.assigned_doctor.nil? %>" />
<% end %>
我还为 journal
模型条目(在其他文件中)创建了 CRUD 资源。并且在不对 profile
产生 CRUD 视图的情况下,它们工作正常。
也许问题是,profile
不知道传递给它的上下文,所以它会这样响应。但是不知道如何解决它。
如果你愿意,我可以添加更多代码。
总和:
当@journal == nil
为什么<%=@journal.identity unless @journal.identity.nil?%>
returnundefined method 'identity' for nil:NilClass
?
下面有一些有用的资源:
in user.rb(包含3个classes/models)与main.rb同目录。
# model declerations end here
DataMapper.finalize
module JournalHelpers
def find_journals
@journals = Journal.all
end
def find_journal
Journal.get(params[:id])
end
def create_journal
@journal = Journal.create(params[:journal])
end
end
helpers JournalHelpers
get '/journals' do
find_journals
erb :journals
end
#new
get '/journals/new' do
#protected!
@journal = Journal.new
erb :new_journal
end
#show
get '/journals/:id' do
@journal = find_journal
erb :show_journal
end
#create
post '/journals' do
#protected!
flash[:notice]= "Journal was succesfull posted" if create_journal
redirect to("/journals/#{@journal.id}")
end
#edit
get '/journals/:id/edit' do
#protected!
@journal = find_journal
erb :edit_journal
end
#put/update
put '/journals/:id' do
#protected!
journal = find_journal
if journal.update(params[:journal])
flash[:notice] = "Journal successfully updated"
end
redirect to("/journals/#{journal.id}")
end
程序结构
├── assets
│ ├── css
│ │ ├── application.css
│ │ ├── jquery-ui.min.css
│ │ └── main.css
│ ├── images
│ │ ├── loader.gif
│ │ └── nurse_shshsh.jpeg
│ └── js
│ ├── application.js
│ ├── jquery.min.js
│ └── jquery-ui.min.js
├── main.rb
├── user.rb
├── users.db
└── views
├── about.erb
├── assign_doctor.erb
├── contact.erb
├── doctor_screen.erb
├── edit_journal.erb
├── home.erb
├── journal_form.erb
├── journals.erb
├── layout.erb
├── leftcolumn.erb
├── login.erb
├── nav.erb
├── new_journal.erb
├── notifications.erb
├── profile.erb
└── show_journal.erb
正在检查日志是否为 nil。
get '/profile' do
if !authorized?
redirect to('/login')
else
puts "nihil" if @journal.nil?
erb :profile
end
end
服务器日志
127.0.0.1 - - [29/Jun/2015:22:35:33 +0500] "GET /profile HTTP/1.1" 302 - 0.0029
127.0.0.1 - - [29/Jun/2015:22:35:33 +0500] "GET /login HTTP/1.1" 200 212 0.0024
127.0.0.1 - - [29/Jun/2015:22:35:42 +0500] "POST /login HTTP/1.1" 303 - 0.0167
nihil
127.0.0.1 - - [29/Jun/2015:22:35:43 +0500] "GET /profile HTTP/1.1" 200 1047 0.0106
@journal 为零。
如果@journal 为零,@journal.identity 或@journal.almost_any_function 将引发错误。我想你真正想要的是:
<%=@journal.identity unless @journal.nil?%>
如评论中所述。或者#try定义在rails中,你可以这样做:
<%= @journal.try(:identity) %>
在@journal 本身为 nil 的情况下,它们都将 return nil 而不会引发 NoMethod 错误。如果定义了@journal,它将return @journal.identity
的值 正如我在评论中所述,最明显的解决方案是使用 <%= @journal.identity unless @journal.nil?%>
因为如果 @journal == nil
那么 @journal.nil?
将 return 为真,并且整个语句将return 无。当您 post 完整代码时,我将继续更新此答案。
在我看来,您的代码依赖于 @journal
字段集这一事实。 (这到底是谁的日记?)肯定不是在 main.rb
中设置的。您应该在 get '/profile'
块中获得所需的数据。大致如下:
get '/profile' do
if !authorized?
redirect to('/login')
else
@journal = Journal.get(params[:id])
erb :profile
end
end
有多种方法可以做到这一点。通常最好避免调用之间的任何共享状态,而是在每个特定请求中获取所有需要的数据。 (数据仍然可以像在您的 JournalHelper 模块中一样被重用。)如果数据库访问成为瓶颈,最好的方法通常是在数据库或 Web 服务器前面引入缓存。