Hartl第11章Ajax未定义的局部变量或方法"cookies" [英] Hartl Chapter 11 Ajax undefined local variable or method `cookies'

查看:58
本文介绍了Hartl第11章Ajax未定义的局部变量或方法"cookies"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写Hartl教程,目前在第11.2.5章中使用AJAX的工作跟随按钮.

I am doing the Hartl Tutorial, and am currently in Chapter 11.2.5 A working follow button with AJAX.

我的关系控制器测试失败,我不知道为什么.预期的行为发生在浏览器中.如果删除cookie方法,它将导致许多其他测试失败.我在想什么导致这个问题?

My tests are failing for the Relationship Controller and I can't figure out why. The expected behavior happens in the browser. If I remove the cookies method it causes many other tests to fail. What am I missing that is causing this issue?

require 'spec_helper'

describe RelationshipsController do

  let(:user) { FactoryGirl.create(:user) }
  let(:other_user) { FactoryGirl.create(:user) }

  before { sign_in user, no_capybara: true }

  describe "creating a relationship with Ajax" do

    it "should increment the Relationship count" do
      expect do
        xhr :post, :create, relationship: { followed_id: other_user.id }
      end.to change(Relationship, :count).by(1)
     end

    it "should respond with success" do
      xhr :post, :create, relationship: { followed_id: other_user.id }
      expect(response).to be_success
    end
  end

  describe "destroying a relationship with Ajax" do

    before { user.follow!(other_user) }
    let(:relationship) { user.relationships.find_by(followed_id: other_user) }

    it "should decrement the Relationship count" do
     expect do
       xhr :delete, :destroy, id: relationship.id
      end.to change(Relationship, :count).by(-1)
    end

    it "should respond with success" do
      xhr :delete, :destroy, id: relationship.id
     expect(response).to be_success
    end
  end
end

这是我的实用工具.rb

include ApplicationHelper

RSpec::Matchers.define :have_error_message do |message|
  match do |page|
   expect(page).to have_selector('div.alert.alert-error', text: message)
  end
end

def sign_in(user, options={})
  if options[:no_capybara]
    # Sign in when not using Capybara.
   remember_token = User.new_remember_token
   cookies[:remember_token] = remember_token
   user.update_attribute(:remember_token, User.encrypt(remember_token))
  else
   visit signin_path
   fill_in "Email",    with: user.email
   fill_in "Password", with: user.password
   click_button "Sign in"
  end
end

这是我的Relationships_controller.rb

class RelationshipsController < ApplicationController
  before_action :signed_in_user

  def create
    @user = User.find(params[:relationship][:followed_id])
    current_user.follow!(@user)
    respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end
  end

  def destroy
    @user = Relationship.find(params[:id]).followed
    current_user.unfollow!(@user)
    respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end
  end
end

这是我的测试输出:

Failures:

  1) RelationshipsController creating a relationship with Ajax should increment the        Relationship count
     Failure/Error: before { sign_in user, no_capybara: true }
     NameError:
      undefined local variable or method `cookies' for #     <RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x007fc7f827f930>
      # ./spec/support/utilities.rb:13:in `sign_in'
     # ./spec/models/relationship_spec.rb:8:in `block (2 levels) in <top (required)>'

  2) RelationshipsController creating a relationship with Ajax should respond with success
     Failure/Error: before { sign_in user, no_capybara: true }
     NameError:
       undefined local variable or method `cookies' for #    <RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x007fc7f8516a90>
     # ./spec/support/utilities.rb:13:in `sign_in' 
    # ./spec/models/relationship_spec.rb:8:in `block (2 levels) in <top (required)>'

 3) RelationshipsController destroying a relationship with Ajax should decrement the     Relationship count
    Failure/Error: before { sign_in user, no_capybara: true }
    NameError:
    undefined local variable or method `cookies' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_2:0x007fc7f85367f0>
     # ./spec/support/utilities.rb:13:in `sign_in'
     # ./spec/models/relationship_spec.rb:8:in `block (2 levels) in <top (required)>'

  4) RelationshipsController destroying a relationship with Ajax should respond with success
    Failure/Error: before { sign_in user, no_capybara: true }
    NameError:
      undefined local variable or method `cookies' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_2:0x007fc7f8556938>
    # ./spec/support/utilities.rb:13:in `sign_in'
    # ./spec/models/relationship_spec.rb:8:in `block (2 levels) in <top (required)>'

Finished in 0.06635 seconds
4 examples, 4 failures

Failed examples:

 rspec ./spec/models/relationship_spec.rb:12 # RelationshipsController creating a    relationship with Ajax should increment the Relationship count
 rspec ./spec/models/relationship_spec.rb:18 # RelationshipsController creating a   relationship with Ajax should respond with success
 rspec ./spec/models/relationship_spec.rb:29 # RelationshipsController destroying a relationship with Ajax should decrement the Relationship count
 rspec ./spec/models/relationship_spec.rb:35 # RelationshipsController destroying a relationship with Ajax should respond with success

推荐答案

我注意到您将对RelationshipsController的测试放在了 spec/models 中.这真的是本教程所说的吗?尝试将其放在 spec/controllers 下,以便将其视为控制器规范.

I noticed you put your test of RelationshipsController in spec/models. Is that really what the tutorial says to do? Try putting it under spec/controllers so it is treated as a controller spec.

这篇关于Hartl第11章Ajax未定义的局部变量或方法"cookies"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆