2017-06-04 42 views
-1

在我的應用程序導航欄,我有以下代碼: 應用程序/視圖/佈局/ application.html.erb:爲什麼邏輯在我的Rails應用程序中不起作用?

<ul class="nav navbar-nav navbar-right"> 
     <% if user_signed_in? %> 
      <%if current_user.userinfo(&:info_complete) %> 
       <li><%= link_to "My profile", userinfo_path(current_user.userinfo.id) %></li> 
      <% elsif current_user.employer(&:info_complete)%> 
       <li><%= link_to "My profile", employer_path(current_user.employer.id) %></li>  
      <%else%> 
       <li><%= link_to "Complete Profile", application_studoremp_path %></li>   
      <%end%> 
      <li><%= link_to "Sign Out", destroy_user_session_path, method: :delete %></li>  
     <% else %> 
      <li><%= link_to "Log In", new_user_session_path %></li> 
      <li><%= link_to "Sign Up", new_user_registration_path %></li>     
     <% end %> 
    </ul> 

當用戶註冊後,他們將被引導到一個頁面選擇如果他們想繼續作爲僱主或學生,那麼他們將被引導到一個頁面來填寫用戶信息,如果他們選擇學生,或者如果他們選擇僱主填寫僱主信息。因此,在註冊和填寫其中一個表單之間,用戶不會擁有「userinfo.id」或「employer.id」。這就是爲什麼我將它們重定向到「application_studoremp_path」。但該應用程序拋出一個錯誤,說沒有找到userinfo.id。顯然它沒有被發現,因爲它還沒有被創建,這就是爲什麼有一個「其他」部分。爲什麼邏輯不起作用? :info_complete是userinfo模型和僱主模型中的函數,用於檢查信息是否已填寫。一切工作正常,如果用戶已經存在(如果userinfo.id或employer.id已經存在)。 這是錯誤: enter image description here

我userinfo.rb型號:

class Userinfo < ActiveRecord::Base 
    belongs_to :user 

    def info_complete? 
     name? && email? && college? && gpa? && major? 
    end 

回答

0

看來問題是你的函數info_complete未返回正確的值。

我建議你試試就可以了一些測試,我想,當你想從你的模型引用變量,你應該使用「:」,像這樣:

def info_complete 
    :name? && :age? 
end 
+0

嘿佩德羅,我的模型是對,因爲它在其他地方有效。它僅在用戶登錄後才起作用。我的問題是,既然info_complete在Userinfo或Employer上的返回值都不爲真,爲什麼代碼不會直接跳轉到

  • <%= link_to「完整配置文件」, application_studoremp_path%>
  • line? – Dinukaperera

    +0

    我認爲它不會跳躍,因爲你的函數返回true(當應該是false),這就是爲什麼。拋出錯誤顯示rails正在嘗試訪問您的第一條語句。試着改變用戶信息和僱主聲明的立場,讓僱主第一。 –

    +0

    你嘗試了我的第一個建議嗎?使用 」:」 –

    0

    您正使用方法不正確。 符號method(&:other)method {|i| i.other}的簡寫。這裏發生的是前綴&與在前綴對象上調用to_proc方法相同。

    現在,userinfo是一個getter,你可以將它傳遞給一個塊(當然),但它會被忽略,它只是一個getter。

    所以你實際做的是檢查userinfo是不是nil(或false)。你也可以知道,因爲(&:info_complete)甚至不會觸發NoMethodError(它應該,因爲沒有info_complete,所以有info_complete?)。

    你應該做的是隻用userinfo.info_complete?如果您擔心user_info可能是零,安全航行操作做到這一點:userinfo&.info_complete?

    延伸閱讀:Ampersand operator Safe navigation operator

    相關問題