Rails3中的路由 - 2个后期功能的控制器和路由

时间:2011-03-22 18:10:16

标签: ruby-on-rails-3 routes

我正在尝试在rails 3中编写一个应用程序,并且我在查找我想要用户进行的测试的路由和控制器时遇到了一些麻烦。此应用程序的基本要求是:

  1. 用户,测试和问题都在不同的模型中。
  2. 用户has_many测试。测试has_many问题
  3. 在user_profile页面上提供/ test / new链接以创建测试记录。
  4. 在/ test /:id / part1(其中:id是test_id)上提供/ test / new链接,以便用户可以完成测试的第一部分。问题将从数据库中检索出来并显示在此页面上。
  5. 在/ test /:id / part1上提供/ test /:id / part2的链接,以便用户可以完成测试的第二部分。同样,从数据库中检索问题。
  6. 在/ test /:id / part2上提供一个链接以提交测试并返回用户的个人资料。
  7. 我已经完成了模型,甚至通过了测试,所以我认为我已经完成了第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>}
    

    对此的任何帮助将不胜感激。

1 个答案:

答案 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?

如果你什么都不懂,请告诉我。