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代わりにas を呼び出すことができます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

コードを何度も見直しましたが、修正方法がわかりません。考え?

ありがとう

EDIT
返信が遅くなり申し訳ありません。これが私の破壊アクションが私の中でどのように見えるか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が、以前は工場がそれを現在のユーザーに関連付けていたという兆候は見られません。あるグループに属するユーザーを作成し、他のグループに属するアイテムがある場合はそのアイテムを作成し、ユーザーにすべてのアイテムを削除するように依頼するようです。

于 2013-11-04T21:33:38.653 に答える