我想弄清楚为什么这不起作用。
假设你有三个型号,User,Foo和Bar。为了创建一个条,用户必须首先创建并验证一个foo对象。
Class User #snip!
has_many :foos
has_many :bars
Class Foo #snip!
belongs_to :user
has_many :bars
Class Bar #snip!
belongs_to :user
belongs_to :foo
我正在尝试进行功能测试,如果用户尝试在没有有效foo的情况下创建新Bar,则会将其重定向到Foo的“new”操作。
我对重定向方案没有任何问题。但是,当我尝试使用有效的Foo对象设置用户并尝试获取Bar的“新”操作时,它仍然会被重定向到Foo控制器的“new”操作。它仍然不承认用户有Foo。
这是我的控制器:
class BarsControllerTest < ActionController::TestCase
setup :activate_authlogic
def setup
@request.env['HTTPS'] = nil
@user = Factory.build(:user)
@foo = Factory.build(:foo, :user => @user)
end
test "should get new when user has a valid foo" do
@request.env['HTTPS'] = 'on'
UserSession.create(@user)
get :new
assert_response :success
end
这是我的应用程序控制器中的重定向功能,在我的条形码控制器中调用:
def foo_required
if current_user && @current_user.foos.valid.empty? && @current_user.foos.empty?
flash[:notice] = "You must have a verified foo in order to create a Bar!"
redirect_to new_foo_path
elsif current_user && @current_user.foos.valid.empty?
flash[:notice] = "You must verify your foos in order to create a Bar!"
redirect_to foos_path
end
end
这是Foo工厂:
Factory.define :foo do |f|
#attributes
f.valid true
f.association :user
end
相反,我被重定向到“https://test.host:80/foos/new”控制器不会确认用户有Foo ......
会话有效,所以这似乎是工厂问题,但我不确定它是什么。
答案 0 :(得分:3)
我假设这是factory_girl。您正在调用Factory.build
,它不会向数据库保存任何内容,因此您永远不会拥有关联所需的外键值。将它们切换到Factory.create
,您应该会看到差异。