2009-08-15 8 views
3

Dies ist eine schwierige Frage, denke ich. Ich habe einen Kommentar Controller, dass ich für alle meine anderen Controller verwenden möchten: wie Bücher, Titel, usw.Controller im Zusammenhang mit mehreren Controllern in Schienen

Das Problem ist, das schaffen Aktion in den Kommentaren ist:

def create 
    @book = Book.find(params[:book_id]) 
    @comment = @book.comments.create!(params[:comment]) 
    respond_to do |format| 
    format.html {redirect_to @book} 
    format.js 
    end 

Ende

also wie kann ich die Aktion & Kommentare Controller für Titel verwenden, wenn es eindeutig Bücher Attribute verwendet?

Antwort

5

Ich nehme an, Sie haben eine polymorphe Assoziation Setup auf Kommentar, so dass es zu vielen verschiedenen Arten von Modellen gehören kann? Werfen Sie einen Blick auf this Railscasts episode, die zeigt, wie Sie dies zusammen mit der Controller-Aktion einrichten. Hier ist das Schlüssel-Bit des Codes.

# comments_controller 
def create 
    @commentable = find_commentable 
    @comment = @commentable.comments.build(params[:comment]) 
    if @comment.save 
    flash[:notice] = "Successfully created comment." 
    redirect_to :id => nil 
    else 
    render :action => 'new' 
    end 
end 

private 

def find_commentable 
    params.each do |name, value| 
    if name =~ /(.+)_id$/ 
     return $1.classify.constantize.find(value) 
    end 
    end 
    nil 
end 

# routes.rb 
map.resources :books, :has_many => :comments 
map.resources :titles, :has_many => :comments 
map.resources :articles, :has_many => :comments 
0

Das ist etwas, worüber ich auch gesprochen habe. Sie müssten die create-Methode zunächst unabhängig vom übergeordneten Objekt machen.

Dann würden Sie ein paar Möglichkeiten:

  1. ein belonsg_to für jede Sache Haben Sie den Kommentar möglicherweise angebracht werden könnten, und einer von ihnen selektiv heraus zu füllen.
  2. Haben die Bücher/Titel/etc belongs_to der Kommentar

ich ziemlich neu bin ich Rails, so dass ich weiß nicht, dass der „richtige Weg“, Dinge zu tun ist, vielleicht jemand anderes hat eine bessere Lösung.

0

Nun, Sie können dies nicht tun, ohne für jedes der Controller spezifisch zu sein.

Wenn Sie ein allgemeines Kommentarmodell für eine Reihe von Modellen in Ihrer Anwendung erstellen möchten, müssen Sie den Modelltyp übergeben, für den Sie einen Kommentar erstellen (aber nicht das Modell selbst), und dann erstellen ein Schalter, der basierend auf dem, was Sie übergeben, ein anderes Verhalten bietet.

def create 
    if params[:type]="book" 
    @book = Book.find(params[:book_id]) 
    @comment = @book.comments.create!(params[:comment]) 
    respond_to do |format| 
     format.html {redirect_to @book} 
     format.js 
    elsif params[:type]="title" 
    @title = Title.find(params[:title_id]) 
    @comment = @title.comments.create!(params[:comment]) 
    respond_to do |format| 
     format.html {redirect_to @title} 
     format.js 
    end 
end