2011-01-16 2 views
2

Ich bin sicher, ich vermisse etwas Einfaches, aber nicht bewusst, die richtige Terminologie in Rails, ich kann nicht finden, was ich bin gesucht ....Erstellen Sie ein Kind-Modell in Schienen (Angehörige_to) und Voreinstellung der Eltern-ID

A Project Modell has_many Task und ein Task belongs_to ein Project.

Mein routes.rb

resources :projects 
resources :tasks 

hat, kann ich erstellen/bearbeiten/ändern Projects ganz gut, und ich kann auch Tasks bearbeiten ... aber ich kann nicht zu arbeiten scheinen, wie eine neue Task zu schaffen, Zuweisen der richtigen Project dabei.

Meine Project Seite (zB. Projekte/2) hat einen Add Task Link, der zu/task/new geht, also verliere ich die Verbindung. Ich möchte keine geschachtelte Ressource erstellen, da Tasks, einmal erstellt, durch ihre ID eindeutig identifiziert werden kann und in Zukunft auch viele andere Modelle hat.

Gibt es hier eine schnelle Lösung?

bearbeiten Nun, ich habe es geschafft, dies zu lösen .... es ist hässlich und es ist schrecklich und ich bin mir nicht sicher, warum es so sein muss, aber es funktioniert.

Meine Routen:

resources :projects do 
    resources :tasks, :only => [:new] 
end 

resources :tasks, :except => [:new] 

Meine Aufgabe Controller:

def new 
    @project = Project.find(params[:project_id]) 
    @task = @project.tasks.build 
end 

# Process the form for creating a new task. 
def create 
    @project = Project.find(params[:task][:project_id]) 
    @task = @project.tasks.build(params[:task]) 
    if @task.save 
    flash[:success] = 'Task created.' 
    redirect_to project_path(@project) 
    else 
    render 'new' 
    end 
end 

Und meine Aufgabe Form:

<%= semantic_form_for @task do |f| %> 

<%= render 'shared/form_message', :object => f.object %> 

<%= f.inputs do %> 
    <%= f.input :name %> 
    <%= f.input :project %> 
<% end %> 

<ul class="formActions"> 
    <li class="list"><%= link_to 'Back to list', project_path(@task.project) %></li> 
    <li><%= f.submit "Save" %></li> 
</ul> 

<% end %> 

Ich möchte nicht auf das Projekt Feld haben, setzen das Formular, und ich bin immer noch nicht sicher, warum ich muss, und auch warum ich brauchte: Erstellen aus der verschachtelten Routen. Es scheint auch ziemlich mühsam, für solch eine gemeinsame Aufgabe, aber es funktioniert, also .... Ich denke, es ist alles gut.

Antwort

1

Es klingt wie das, was Sie wollen, ist eine verschachtelte Route nur zum Erstellen von Aufgaben.

resources :projects do 
    resources :tasks, :only=>[:new, :create] 
end 
resources :tasks, :except=>[:new, :create] 

EDIT: Hier ist eine überarbeitete Version des Codes, die ein bisschen sauberer sein sollte. Mit einer kleinen Ausleihe von edgerunner.

Task-Controller:

before_filter :get_project 

def new 
    @task = Task.new 
end 

# Process the form for creating a new task. 
def create 
    @task = Task.new params[:task] 
    @task.project_id = params[:project_id] 
    if @task.save 
    flash[:success] = 'Task created.' 
    redirect_to project_path(@task.project_id) 
    else 
    render 'new' 
    end 
end 

private 

def get_project 
    @project = Project.find(params[:project_id]) 
end 

und die Aufgabe Form:

<%= form_for [@project, @task] do |f| %> 

    <%= render 'shared/form_message', :object => f.object %> 

    <%= f.inputs do %> 
    <%= f.input :name %> 
    <% end %> 

    <ul class="formActions"> 
    <li class="list"><%= link_to 'Back to list', project_path(@task.project) %></li> 
    <li><%= f.submit "Save" %></li> 
    </ul> 

<% end %> 
+0

hmm, das hat meine Routen geändert ... aber ich habe immer noch ein bisschen Ärger. Ich habe Änderungen an meinem TaskController vorgenommen, sodass jetzt Tasks über das übergeordnete Projekt erstellt werden, aber ... es funktioniert immer noch nicht. :( – sevenseacat

+0

Kennen Sie irgendwelche Tutorials, die diese Art von Sache zu tun, Anfang bis Ende? – sevenseacat

+0

Sie möchten vielleicht einen Blick auf http://railscasts.com/episodes/139-nested-resources – aNoble

2

Stellen Sie sicher, dass Ihre neue Aufgabe durch Ihr Projekt in Ihrer neuen Aufgabe Aktion bauen, so dass es mit dem Projekt ID kommen bereits zugewiesen. Das sollte Ihren Formulargenerator dazu bringen, sich gut zu verhalten und das Richtige zu tun.

TasksController < AplicationController 
    before_filter :get_project 
    … 
    def new 
    @task = @project.tasks.build # don't use @task = Task.new here! 
    end 
    … 
    def get_project 
    @project = Project.find(params[:project_id]) 
    end 
end 

natürlich ist es sehr empfehlenswert, verschachtelte Routen zu verwenden.

resources :projects do 
    resources :tasks 
end