设计自定义sign_in错误

时间:2011-09-18 07:04:38

标签: ruby-on-rails-3 devise

我有一个使用Devise的自定义SessionsController,当我浏览/ users / sign_in并输入一些authdata然后提交时,会出现一些错误。

NoMethodError in Users::SessionsController#create

undefined method `serialize_into_session' for Symbol:Class
Rails.root: /home/kewang/rails/devisetest

Application Trace | Framework Trace | Full Trace
devise (1.4.5) lib/devise/rails/warden_compat.rb:19:in `serialize'
warden (1.0.5) lib/warden/session_serializer.rb:25:in `store'
warden (1.0.5) lib/warden/proxy.rb:161:in `set_user'
devise (1.4.5) lib/devise/controllers/helpers.rb:111:in `sign_in'
app/controllers/users/sessions_controller.rb:3:in `create'

应用程序/控制器/用户/ sessions_controller.rb

class Users::SessionsController < Devise::SessionsController
  def create
    sign_in(resource_name, resource)
  end
end

应用程序/助手/ application_helper.rb

module ApplicationHelper
  def resource_name
    :user
  end

  def resource
    @resource ||= User.new
  end

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

配置/ routes.rb中

devise_for :users, :controllers => { :sessions => "users/sessions" }

我能做什么?

我的开发环境是Rails 3.1.0,Ruby 1.9.2

2 个答案:

答案 0 :(得分:1)

Devise在其控制器中使用了一堆自定义方法。

您可以尝试调用super来获取方法,或者

class Users::SessionsController < Devise::SessionsController
  def create
    sign_in(resource_name, resource)
    super
  end
end

但我建议包括整个Devise Sessions #create方法,然后改变那个基础的东西。 Link here

def create
  self.resource = warden.authenticate!(auth_options)
  set_flash_message(:notice, :signed_in) if is_navigational_format?
  sign_in(resource_name, resource)
  respond_with resource, :location => after_sign_in_path_for(resource)
end

答案 1 :(得分:0)

你想要的是

sign_in:user

我认为常见的错误是创建用户,比如工厂,然后尝试

let(:user){create(:user)}

...然后使用current_user作为字符串调用sign_in:

sign_in用户

..这会导致可怕的“serialize_in_session”错误。