2015-02-07 76 views
2

我有這條線在<...>/layouts/application.html.erb設計助手返回nil

<% if client_signed_in? %> 

要呈現不同的HTML無符號/簽約客戶。起初我使用SQLite3,一切正常,直到我試圖使用MySQL。所以,我運行遷移文件,插入與rake db:seed相同的數據並使用Devise API註冊,然後檢查數據是否插入到數據庫中。於是我試圖用相同的API登錄並收到以下錯誤上面的一行:

未定義的方法`的零to_sym」:NilClass

或者從日誌更具體的版本:

ActionView::Template::Error (undefined method `to_sym' for nil:NilClass): 
    11: <div class="navbar navbar-default navbar-fixed-top" role="navigation"> 
    12: <div class="container"> 
    13:  <ul class="nav navbar-nav navbar-right"> 
    14:  <% if client_signed_in? %> 
    15:   <li class="dropdown"> 
    16:    <a href="#" class="dropdown-toggle" data-toggle="dropdown"> 
    17:    <span class="glyphicon glyphicon-user"></span>  
    app/views/layouts/application.html.erb:14:in `_app_views_layouts_application_html_erb___3350269212856659822_70353324331380' 

我得到了所有設計助手一樣,像current_client(對應型號爲Client)等。

database.yml

development: 
    adapter: mysql2 
    encoding: utf8 
    database: development 
    pool: 5 
    username: root 
    password: 
    socket: /tmp/mysql.sock 

ApplicationHelper

module ApplicationHelper 
    def resource_name 
     :client 
    end 

    def resource 
     @resource ||= Client.new 
    end 

    def devise_mapping 
     @devise_mapping ||= Devise.mappings[:client] 
    end 
end 

Client型號:

class Client < ActiveRecord::Base 
    devise :database_authenticatable, :registerable 
end 

會議轉儲:

_csrf_token: 「YYUINrP + 2synbq2bayWVozyo3nfGVtzkxDd9QJn9S4k =」 閃光:{ 「丟棄」=> [], 「閃爍」=> { 「通知」=> 「符號中成功。」}} SESSION_ID: 「6ab5a131dc9300e2a3c0dbd4e00218f0」 區長。 user.client.key:[[2], 「$ 2A $ 10 $ bqpnIBKi4XCy64TH1zzhB」]

所以,你可以看到,會話不是空的,它需要正確id從模型/ DB,過程登錄也是成功的。

ENV轉儲:

GATEWAY_INTERFACE: "CGI/1.1" 
HTTP_ACCEPT:"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" 
HTTP_ACCEPT_ENCODING: "gzip,deflate,sdch" 
HTTP_ACCEPT_LANGUAGE: "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4" 
HTTP_CACHE_CONTROL: "max-age=0" 
REMOTE_ADDR: "::1" 
REMOTE_HOST: "::1" 
+0

請張貼您的整個錯誤信息。 – joelparkerhenderson 2015-02-07 23:05:17

+0

@ joelparkerhenderson:你能更具體嗎?我只得到上面的消息。你需要框架跟蹤嗎? – 2015-02-07 23:09:32

+0

這很有幫助。你可以發佈你的方法'client_signed_in?'的代碼嗎?而且,你確定這是一個很長的方法名,而不應該是兩個方法,一個點,即'client.signed_in?' – joelparkerhenderson 2015-02-07 23:30:14

回答

1

感謝張貼的所有細節。這裏有一個建議來調試它。

設計自動生成方法,如您的client_signed_in?不起作用。

您可以通過編輯Devise源代碼來攔截此方法並找出發生了什麼。

設計出具有包含自動生成代碼的文件helper.rb

def #{mapping}_signed_in? 
    !!current_#{mapping} 
end 

def current_#{mapping} 
    @current_#{mapping} ||= warden.authenticate(scope: :#{mapping}) 
end 

攔截方法,你可以使用調試器,或打印,或提高:

def current_#{mapping} 
    raise "Devise current mapping #{__method__} symbol is " + (:{mapping}).to_s 
    @current_#{mapping} ||= warden.authenticate(scope: :#{mapping}) 
end 

如果您使用撬,或想學習撬,因爲這種調試比較麻煩:http://www.jackkinsella.ie/2014/06/06/debugging-rails-with-pry-debugger.html

def current_#{mapping} 
    binding.pry 
    @current_#{mapping} ||= warden.authenticate(scope: :#{mapping}) 
end 

我的猜測是這種方法是你的錯誤發生的地方,而「映射」變量可能是零。

+0

不知何故,它沒有給出任何結果(用'raise'或'print') - 它只是拋出相同的錯誤(我是一個新手紅寶石和RoR,順便說一句)。這真令人失望,這是因爲SQLite數據庫可以正常工作,所以可能是整理或編碼問題。 – 2015-02-08 23:18:46