在学习Rails时,我创建了一个嵌套在Domains
控制器下面的Customers
控制器的应用程序。我正在使用Rails 2.3.4,这是一次学习经历。我设法得到以下路由设置:
customer_domains GET /customers/:customer_id/domains(.:format) {:controller=>"domains", :action=>"index"}
POST /customers/:customer_id/domains(.:format) {:controller=>"domains", :action=>"create"}
new_customer_domain GET /customers/:customer_id/domains/new(.:format) {:controller=>"domains", :action=>"new"}
edit_customer_domain GET /customers/:customer_id/domains/:id/edit(.:format) {:controller=>"domains", :action=>"edit"}
customer_domain GET /customers/:customer_id/domains/:id(.:format) {:controller=>"domains", :action=>"show"}
PUT /customers/:customer_id/domains/:id(.:format) {:controller=>"domains", :action=>"update"}
DELETE /customers/:customer_id/domains/:id(.:format) {:controller=>"domains", :action=>"destroy"}
customers GET /customers(.:format) {:controller=>"customers", :action=>"index"}
POST /customers(.:format) {:controller=>"customers", :action=>"create"}
new_customer GET /customers/new(.:format) {:controller=>"customers", :action=>"new"}
edit_customer GET /customers/:id/edit(.:format) {:controller=>"customers", :action=>"edit"}
customer GET /customers/:id(.:format) {:controller=>"customers", :action=>"show"}
PUT /customers/:id(.:format) {:controller=>"customers", :action=>"update"}
DELETE /customers/:id(.:format) {:controller=>"customers", :action=>"destroy"}
root / {:controller=>"customers", :action=>"index"}
但是,由于路由错误,域控制器的所有测试都失败了。
例如,以下测试(由Rails的资源生成器生成)失败,DomainsControllerTest
类中的所有其他测试都失败。
class DomainsControllerTest < ActionController::TestCase
test "should get index" do
get :index
assert_response :success
assert_not_nil assigns(:domains)
end
end
失败并显示错误:
No route matches {:action => "index", :controller => "domains"}
这是有道理的,因为默认路由不再存在,并且域控制器需要设置@customer
。我花了一个下午寻找所需的更改,但几乎每个网站都会讨论Rspec测试,而不是常规的Rails测试。
如何修改domains_controller_test.rb
以便它能理解嵌套资源?
答案 0 :(得分:47)
将customer_id传递给请求即可。这样的事情: -
class DomainsControllerTest < ActionController::TestCase test "should get index" do get :index ,:customer_id=> 1 assert_response :success assert_not_nil assigns(:domains) end end
答案 1 :(得分:1)
根据您的路线,域名不再存在于客户的上下文之外。请求需要customer_id
才能匹配指定的路由。
在测试中执行此操作的方法是:
test "should get index" do
get :index, :customer_id=>joe
end
答案 2 :(得分:1)
有一个名为nester的宝石可以解决这个问题。它生成的方法可以返回domains_path
,类似于您的路由未嵌套。当您的视图和测试引用时,例如domain_path(domain)
,路由将扩展为customer_domain_path(domain.customer, domain)
。还有一个ActionController::TestCase
助手可为:customer_id => @domain.customer
,get
等方法添加post
。
默认生成的功能测试和视图使用此方法开箱即用。 (免责声明:我写过)。