我实际上在我的应用中实施了一个小用户管理。为此,每个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
内。
自从我更改后,与destroy
或show
方法(控制器)相关的所有内容都按预期工作:
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
之前上述工作正常。我认为我的问题来自于我的用户工厂中没有很好地定义关联:
工厂/ users.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
controller_macros.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
。
答案 0 :(得分:0)
您的测试会创建一个item
但我看不到工厂曾经这样做的任何迹象将其与当前用户相关联。看起来你创建了一个属于一个组的用户,一个属于其他组的用户(如果有的话),然后要求用户删除所有0个项目。