2015-06-29 140 views
5

Whole source code here西納特拉:NoMethodError

我認爲有在程序流,它返回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. 用戶登錄如果認證成功,他/她將被重定向到/profile
    2. 根據自己的角色/權限,他們將看到「/ 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爲什麼<%[email protected] unless @journal.identity.nil?%>回報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爲零。

  • +1

    看起來像'@ journal'是無 – fl00r

    +0

    你在哪裏設置'@ journal',爲什麼你的應用程序文件中的第二個二位代碼? – thesecretmaster

    +0

    @ fl00r是的,問題在於。並捕捉這個錯誤,我已經把'除非'塊。但它吐出錯誤,而不是爲'input'設置空白值。 也許'@ journal'實例沒有正確傳遞給用戶頁面。但我不知道我該如何修復它。 @ IsaiahZwick-Schachter我已經更新了這個問題。你想看到什麼? – marmeladze

    回答

    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服務器前面引入緩存。

    1

    如果@journal爲零,@ journal.identity或@ journal.almost_any_function將引發錯誤。我認爲你在這裏後面是:

    <%[email protected] unless @journal.nil?%> 
    

    正如評論中所述。另外#try在軌道限定,可以這樣做:

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

    這些都將返回nil,而不在@journal本身是零的情況下提高了NoMethod錯誤。如果@journal定義,它將返回@ journal.identity

    +0

    你爲什麼要說我在評論中所說的? – thesecretmaster

    +0

    請在刪除部分答案之前,「或者,#try被定義...」 – thesecretmaster

    +0

    所以你可以在這裏看到我的評論:「我會嘗試'@journal.identity,除非@journal == nil','if @ journal!= nil do @ journal.identity end'等等。「然後我說:「除非@journal ==零,否則不可以?」 – thesecretmaster

    1

    的價值正如我在評論中指出,最明顯的解決方案是使用<%= @journal.identity unless @journal.nil?%>,因爲如果@journal == nil然後@journal.nil?將返回true,整個語句將返回零。當您發佈完整的代碼時,我將繼續更新此答案。

    +0

    我改變了你的建議。問題依然存在。順便說一下,這裏是整個代碼https://github.com/marxistcheguevara/mis – marmeladze

    +0

    你可以添加gemfile嗎? – thesecretmaster

    +0

    對不起,我現在推它。 – marmeladze