设计助手返回nil

问题描述:

我有这条线在<...>/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

感谢张贴的所有细节。这里有一个建议来调试它。

设计自动生成方法,如您的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