2

我实际上在我的应用程序中实现了一个小型用户管理。为此,每个都user属于一个group. 在我的组模型中,我定义了获取关联的方法:

class Group < ActiveRecord::Base
  has_many :items
  has_many :posts

  def get_items
    self.items
  end
end

然后在我的用户模型中,我使用委托:

class User < ActiveModel::Base
  delegate :get_items, to: :group, allow_nil: true
end

它实际上工作正常,然后在我的控制器中,我可以将其称为current_user.get_items而不是current_user.group.items. 我的问题在我的specs. 由于我更改了它,与destroyshow方法(控制器)相关的所有内容都按预期工作:

context 'controllers' do
  login_user

  it 'should delete an item' do
    item = FactoryGirl.create(:item)
    expect{
      delete :destroy, id: item
    }.to change{ Item.count }.from(1).to(0)
  end
end

上面的这个以前工作得很好。我认为我的问题来自我的用户工厂中的关联没有很好地定义:

工厂/用户.rb

FactoryGirl.define do
  factory :user do
    id                    1
    email                 "john@doe.com"
    password              "123456789"
    password_confirmation "123456789"
    association :group_id, factory: :group
  end
end

控制器宏.rb

def login_user
  before(:each) do
    @request.env["devise.mapping"] = Devise.mappings[:user]
    user = FactoryGirl.create(:user)
    user.confirm!
    sign_in user
  end
end

我一遍又一遍地查看我的代码,但不知道如何修复它。想法?

谢谢

编辑
对不起我迟到的回复。这是我的销毁操作在我的items_controller

def destroy
  item = current_user.get_items.find_by id: params[:id]
  item.destroy
  redirect_to items_path, notice: 'Item deleted'
end

运行这些测试时,我得到一个undefined method 'destroy' for nil:NilClass.

4

1 回答 1

0

您的测试创建了一个,item但我没有看到任何迹象表明工厂曾经将其与当前用户相关联。看起来您创建了一个属于一个组的用户,一个属于其他组的项目(如果有),然后要求用户删除他们所有的 0 个项目。

于 2013-11-04T21:33:38.653 回答