我正在尝试在rails 3中编写一个应用程序,并且我在查找我想要用户进行的测试的路由和控制器时遇到了一些麻烦。此应用程序的基本要求是:
我已经完成了模型,甚至通过了测试,所以我认为我已经完成了第1部分和第2部分。
user.rb
Class User < ActiveRecord::Base
has_many :tests
end
test.rb
Class Test < ActiveRecord::Base
belongs_to :user
has_many :questions
end
question.rb
Class Question < ActiveRecrod::Base
belongs_to :test
end
当我尝试使用路线和控制器将这些模型放在一起时,我的问题就开始了。
的routes.rb
resources :users
resources :tests do
member do
post 'part1'
post 'part2'
end
end
用户/ show.html.erb
<%= link_to "Start The Test", new_test_path %>
测试/ new.html.erb
<%= link_to "Part 1", part1_test_path(@test) %>
tests_controler.rb
class TestsController < ApplicationController
def new
@test = Test.new(current_user)
end
def part1
# still just a stub
end
end
当我点击链接以参加测试的第1部分时,我收到此错误:
No route matches {:action=>"part1", :controller=>"tests", :id=>#<Test id: nil, taken_at: nil, user_id: nil, created_at: nil, updated_at: nil>}
对此的任何帮助将不胜感激。
答案 0 :(得分:2)
通过定义路线的成员,它期望存在测试,即。保存并具有身份证明的一个。
e.g。
part1_test_path = /test/123/part1
您需要的是收集路线。
resources :tests do
collection do
post 'part1'
end
member do
post 'part2'
end
end
e.g。
part1_test_path = /test/part1
修改
建议的解决方案:
resources :test, :path_names => { :new => 'part_1', :edit => 'part_2' } *1
def new
@test = Test.new
#new view
form_for @test do
...
def create
@test = Test.new params[:test]
if @test.save
redirect_to edit_test_path @test
def edit
@test = Test.find params[:id]
#edit view
form_for @test do
def update
@test = Test.find params[:id]
if @test.update_attributes params[:test]
redirect_to test_path @test
def show # test results
@test = Test.find params[:id]
if @test.incomplete *2
redirect_to edit_test_path @test
* 1见rails guide on routing。这会给你这样的网址
测试/ part1的 测试/ 123/2部分
您应该将所有验证都放在模型中;您对测试数据的要求。需要进行条件验证,具体取决于它是否为new_record?或不是,即如果你在第1或第2部分。
* 2 在模型中添加一个检查测试完整性的方法。
def incomplete
self.some_test_field.blank?
如果你什么都不懂,请告诉我。