【问题标题】:Sinatra: NoMethodError西纳特拉:NoMethodError
【发布时间】:2015-09-15 14:19:50
【问题描述】:

Whole source code here

我认为我的程序流程中存在逻辑错误,返回 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 

输入标签内的代码是错误文本中描述的确切代码段。

我的程序流程是这样的。

  1. 用户登录
  2. 如果认证成功,他/她将被重定向到/profile页面
  3. 根据他们的角色/权限,他们将在“/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 资源。并且没有产生 CRUD 视图到 profile 他们工作正常。

也许问题是,profile 不知道传递给它的上下文,所以它会这样响应。但不知道如何解决它。

如果你愿意,我可以添加更多代码。

总之:

@journal == nil为什么&lt;%=@journal.identity unless @journal.identity.nil?%&gt;返回undefined method 'identity' for nil:NilClass

下面有一些有用的资源:

user.rb(包含 3 个类/模型)中与 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

检查日志是否为零。

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 为零。

【问题讨论】:

    标签: ruby sinatra nomethoderror ruby-datamapper


    【解决方案1】:

    在我看来,您的代码依赖于有一个 @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 服务器前面引入缓存。

    【讨论】:

      【解决方案2】:

      正如我在 cmets 中所述,最明显的解决方案是使用 &lt;%= @journal.identity unless @journal.nil?%&gt;,因为如果 @journal == nil@journal.nil? 将返回 true,而整个语句将返回 nil。当您发布完整代码时,我将继续更新此答案。

      【讨论】:

      • 我按照您的建议进行了更改。问题仍然存在。顺便说一句,这是整个代码github.com/marxistcheguevara/mis
      • 可以添加 gemfile 吗?
      • 对不起,我现在正在推送。
      【解决方案3】:

      如果@journal 为nil,@journal.identity 或@journal.almost_any_function 将引发错误。我认为您实际上在这里追求的是:

      <%=@journal.identity unless @journal.nil?%>
      

      如 cmets 中所述。或者#try在rails中定义,你可以这样做:

      <%= @journal.try(:identity) %>
      

      在 @journal 本身为 nil 的情况下,它们都将返回 nil 而不会引发 NoMethod 错误。如果定义了@journal,它将返回@journal.identity的值

      【讨论】:

      • 你为什么要跟我在 cmets 里说的一模一样??
      • 请在“或者,#try 已定义...”之前删除您的答案部分
      • 所以你可以在这里看到我的评论:“我会尝试@journal.identity unless @journal == nilif @journal != nil do @journal.identity end,以及更多类似的方法。”然后我说“除非@journal == nil,否则不能吗?”
      猜你喜欢
      • 2010-12-14
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多