2011-03-22 3 views
1

J'essaie d'écrire une application dans les rails 3 et j'ai du mal à trouver les routes et les contrôleurs pour un test que je veux que l'utilisateur prenne. Les exigences de base pour cette application sont les suivants:Routes dans Rails3 - Contrôleur et routes pour 2 fonctions de poste

  1. Les utilisateurs, les tests et les questions sont tous dans des modèles distincts.
  2. Un utilisateur a de nombreux tests. Un test has_many Questions
  3. Fournissez un lien sur la page user_profile vers/test/new pour créer l'enregistrement de test.
  4. Fournissez un lien sur/test/new to/test /: id/part1 (où: id est test_id) afin que l'utilisateur puisse terminer la première partie du test. Les questions seront extraites de la base de données et présentées sur cette page.
  5. Fournissez un lien sur/test /: id/part1 à/test /: id/part2 afin que l'utilisateur puisse terminer la deuxième partie du test. Encore une fois, les questions sont extraites de la base de données.
  6. Fournissez un lien sur/test /: id/part2 pour soumettre le test et revenir au profil de l'utilisateur.

J'ai terminé les modèles, qui passent même leurs tests, donc je pense que je l'ai terminé parties 1 et 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 

Mes problèmes commencent lorsque j'essaie de mettre ces modèles ensemble en utilisant des routes et des contrôleurs.

routes.rb

resources :users 

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

utilisateurs/show.html.erb

<%= link_to "Start The Test", new_test_path %> 

tests/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 

Je reçois cette erreur lorsque je clique sur le lien pour prendre la partie 1 du test:

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

Toute aide sur ce serait grandement apprécié.

Répondre

2

En définissant un membre des routes, il attend un test existant, c'est-à-dire. celui qui est enregistré et a un ID.

par exemple.

part1_test_path = /test/123/part1 

Ce dont vous avez besoin est un itinéraire de collecte.

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

par exemple.

part1_test_path = /test/part1 

modifier

solution proposée:

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 Voir rails guide on routing. Cela vous donnera urls comme celui-ci

test/part1 test/123/part2

Vous devez mettre toute votre validation dans le modèle; vos exigences de données de test. Une validation conditionnelle sera nécessaire, selon qu'il s'agit d'un nouvel enregistrement? ou pas, par exemple si vous êtes à la partie 1 ou 2.

* 2 ajouter une méthode à votre modèle qui vérifie l'exhaustivité des tests.

def incomplete 
    self.some_test_field.blank? 

Faites-moi savoir si vous ne comprenez rien.

+0

Merci pour la réponse Mark. Mais, cette solution ne me donnera-t-elle pas différentes routes pour part1 et part1 (c'est-à-dire part1_test_path =/test/part1 et part2_test_path =/test/123/part2)? Je voudrais être cohérent entre ceux-ci afin que le code de base soit plus maintenable. En utilisant votre idée que le membre attend un test existant, j'ai décidé d'appeler le contrôleur de création sur la page/test/new et d'essayer de rediriger vers part1. Cela semble prometteur. – spinlock

+0

Personnellement j'irais avec mon approche mais la tienne est tout aussi valable. Vous pourriez vouloir regarder ces épisodes de railscasts sur des formes complexes si vous ne l'avez pas déjà fait. http://railscasts.com/episodes/73 Ils sont pour les rails 2 mais à part une petite syntaxe valide pour 3. – mark

+0

Merci Mark. Y a-t-il quelque chose à propos de votre méthode qui serait plus en accord avec "THE RAILS WAY"? Je suis nouveau sur les rails et je veux suivre le style canonique autant que possible parce que je prévois de transmettre cette application à d'autres développeurs, donc j'essaie de suivre - et d'apprendre - les conventions autant que possible. – spinlock

Questions connexes