【问题标题】:Undefined method `to_key' for {:store=>false}:Hash when using `sign_in` helper{:store=>false} 的未定义方法“to_key”:使用“sign_in”帮助程序时的哈希
【发布时间】:2016-01-14 10:22:03
【问题描述】:

我在控制器规范中定义了这个代码块:

describe "DELETE #destroy" do

  before(:each) do
    @user = FactoryGirl.create :user
    sign_in @user, store: false
    delete :destroy, id: @user.auth_token
  end

  it { should respond_with 204 }

end

当我运行测试时,我收到错误 undefined method 'to_key' for {:store=>false}:Hash

这是关联的控制器方法:

def destroy
  user = User.find_by(auth_token: params[:id])
  user.generate_authentication_token!
  user.save
  head 204
end

测试因错误而失败。

【问题讨论】:

  • 你有什么问题?
  • 这个方法签名是sign_in(scope, resource),所以你不能给它传递哈希。
  • 这里的documentation 定义了一个sign_in(resource_or_scope, *args) 方法签名。

标签: ruby-on-rails ruby-on-rails-4 rspec devise


【解决方案1】:

在测试中,您使用的助手与控制器中的助手不同。您正在使用TestHelpers,这里引用documentation

通过将其密钥存储在会话中来登录给定资源。 此方法绕过任何守望者身份验证回调。

例子:

sign_in :user, @user #sign_in(scope, resource)
登录@user #登录(资源)

所以,你不能将哈希传递给这个助手。

【讨论】:

  • 删除哈希时测试通过。这是否意味着即使我没有指定哈希也不会存储会话?
  • @gnerkus 实际上,正如您在源代码中看到的那样,它使用 warden.session_serializer.store(resource, scope) 并且无法像在控制器中使用的帮助程序那样绕过它。但是如果你需要改变它的行为,你可以给这个助手打补丁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
相关资源
最近更新 更多