设计助手返回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"
感谢张贴的所有细节。这里有一个建议来调试它。
设计自动生成方法,如您的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
我的猜测是这种方法是你的错误发生的地方,而“映射”变量可能是零。
不知何故,它没有给出任何结果(用'raise'或'print') - 它只是抛出相同的错误(我是一个新手红宝石和RoR,顺便说一句)。这真令人失望,这是因为SQLite数据库可以正常工作,所以可能是整理或编码问题。 – 2015-02-08 23:18:46
请张贴您的整个错误信息。 – joelparkerhenderson 2015-02-07 23:05:17
@ joelparkerhenderson:你能更具体吗?我只得到上面的消息。你需要框架跟踪吗? – 2015-02-07 23:09:32
这很有帮助。你可以发布你的方法'client_signed_in?'的代码吗?而且,你确定这是一个很长的方法名,而不应该是两个方法,一个点,即'client.signed_in?' – joelparkerhenderson 2015-02-07 23:30:14