66 votes

Rails 3 : Comment créer une nouvelle ressource imbriquée ?

Le site Guide de démarrage de Rails fait en quelque sorte abstraction de cette partie puisqu'il n'implémente pas l'action "new" du contrôleur Comments. Dans mon application, j'ai un modèle de livre qui comporte de nombreux chapitres :

class Book < ActiveRecord::Base
  has_many :chapters
end

class Chapter < ActiveRecord::Base
  belongs_to :book
end

Dans mon fichier de routes :

resources :books do
  resources :chapters
end

Maintenant je veux implémenter l'action "new" du contrôleur Chapters :

class ChaptersController < ApplicationController
  respond_to :html, :xml, :json

  # /books/1/chapters/new
  def new
    @chapter = # this is where I'm stuck
    respond_with(@chapter)
  end

Quelle est la bonne façon de procéder ? En outre, à quoi devrait ressembler la vue script (formulaire) ?

123voto

dombesz Points 5576

Vous devez d'abord trouver le livre correspondant dans votre contrôleur de chapitres pour lui construire un chapitre. Vous pouvez faire vos actions comme ceci :

class ChaptersController < ApplicationController
  respond_to :html, :xml, :json

  # /books/1/chapters/new
  def new
    @book = Book.find(params[:book_id])
    @chapter = @book.chapters.build
    respond_with(@chapter)
  end

  def create
    @book = Book.find(params[:book_id])
    @chapter = @book.chapters.build(params[:chapter])
    if @chapter.save
    ...
    end
  end
end

Dans votre formulaire, nouveau.html.erb

form_for(@chapter, :url=>book_chapters_path(@book)) do
   .....rest is the same...

ou vous pouvez essayer un raccourci

form_for([@book,@chapter]) do
    ...same...

J'espère que cela vous aidera.

6voto

Andrew Vit Points 10630

Essayez @chapter = @book.build_chapter . Lorsque vous appelez @book.chapter c'est nul. Vous ne pouvez pas faire nil.new .

EDIT : Je viens de réaliser que le livre a très probablement_beaucoup de chapitres... ce qui précède est pour has_one. Vous devriez utiliser @chapter = @book.chapters.build . Les chapitres "tableau vide" sont en fait un objet spécial qui répond à build pour ajouter de nouvelles associations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X