Маршруты в Rails3 - Контроллер и маршруты для двух почтовых функций - PullRequest
1 голос
/ 22 марта 2011

Я пытаюсь написать приложение в rails 3, и у меня возникают проблемы с определением маршрутов и контроллеров для теста, который я хочу, чтобы пользователь прошел. Основные требования для этого приложения:

  1. Пользователи, тесты и вопросы представлены в отдельных моделях.
  2. Пользователь has_many Тесты. Тест имеет много вопросов
  3. Укажите ссылку на странице user_profile на / test / new для создания записи теста.
  4. Укажите ссылку на / test / new для / test /: id / part1 (где: id - это test_id), чтобы пользователь мог завершить первую часть теста. Вопросы будут получены из БД и представлены на этой странице.
  5. Укажите ссылку на / test /: id / part1 на / test /: id / part2, чтобы пользователь мог выполнить вторую часть теста. Опять же, вопросы получены из базы данных.
  6. Укажите ссылку на / test /: id / part2, чтобы отправить тест и вернуться в профиль пользователя.

Я закончил модели, которые даже прошли их тесты, поэтому я думаю, что я закончил части 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

Я получаю эту ошибку, когда нажимаю на ссылку, чтобы пройти первую часть теста:

No route matches {:action=>"part1", :controller=>"tests", :id=>#<Test id: nil, taken_at: nil, user_id: nil, created_at: nil, updated_at: nil>}

Любая помощь по этому вопросу будет принята с благодарностью.

1 Ответ

2 голосов
/ 22 марта 2011

Определяя члена маршрутов, он ожидает существующий тест, т.е. тот, который сохранен и имеет идентификатор.

, например

part1_test_path = /test/123/part1

Вам нужен маршрут сбора.

resources :tests do
  collection do
    post 'part1'
  end
  member do
    post 'part2'
  end
end

например.

part1_test_path = /test/part1

1012 * редактировать *

Предлагаемое решение:

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 См. руководство по направляющим при прокладке . Это даст вам URL, как это

тест / part1 тест / 123 / part2

Вы должны поместить все свои проверки в модель; Ваши требования к данным испытаний. Требуется условная проверка, в зависимости от того, является ли это new_record? или нет, т.е. если вы на части 1 или 2.

* 2 добавьте метод к вашей модели, который проверяет полноту теста.

def incomplete
  self.some_test_field.blank?

Дайте мне знать, если вы ничего не понимаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...