#Project controller class ProjectsController < ApplicationController
def index @projects = Project.find(:all) end def new @project = Project.new @project.tasks.build end def create @project = Project.new(params[:project]) if @project.save flash[:notice] = "Successfully created project and tasks." redirect_to projects_path else render :action => 'new' end end def edit @project = Project.find(params[:id]) end def update params[:project][:existing_task_attributes] ||= {} @project = Project.find(params[:id]) if @project.update_attributes(params[:project]) flash[:notice] = "Successfully updated project and tasks." redirect_to project_path(@project) else render :action => 'edit' end end end #Project.rb class Project < ActiveRecord::Base has_many :tasks, :dependent => :destroy validates_presence_of :name validates_associated :tasks after_update :save_tasks def new_task_attributes=(task_attributes) task_attributes.each do |attributes| tasks.build(attributes) end end def existing_task_attributes=(task_attributes) tasks.reject(&:new_record?).each do |task| attributes = task_attributes[task.id.to_s] if attributes task.attributes = attributes else tasks.delete(task) end end end def save_tasks tasks.each do |task| task.save(false) end end end #Project/_task.html.erb <% @task = task %> <%= error_messages_for :task %> <div class="task"> <% fields_for_task(task) do |task_form| %> <p> Task: <%= task_form.text_field :name %> <%= link_to_function "remove", "$(this).up('.task').remove()" %> </p> <% end %> </div> #Project/edit.html.erb <% form_for :project, :url => project_path(@project), :html => { :method => 'put' } do |f| %> <%= render :partial => 'fields', :locals => { :f => f } %> <p><%= submit_tag "Update Project" %></p> <% end %> #Project/_fields.html.erb <%= error_messages_for :project %> <p> Name: <%= f.text_field :name %> </p> <div id="tasks"> <%= render :partial => 'task', :collection => @project.tasks %> </div> <p> <%= link_to_function('Add') do |page| page.visual_effect :highlight, 'tasks' end%> </p> #Project/show.html.erb <%= link_to 'Edit', edit_project_path(@project) %> | <%= link_to 'Back', projects_path %> #projects/new.html.erb <% form_for :project, :url => projects_path do |f| %> <%= render :partial => 'fields', :locals => { :f => f } %> <p><%= submit_tag "Create Project" %></p> <% end %> #project_helper module ProjectsHelper def fields_for_task(task, &block) prefix = task.new_record? ? 'new' : 'existing' fields_for("project[#{prefix}_task_attributes][]", task, &block) end def add_task_link(name) link_to_function name do |page| page.insert_html :bottom, :tasks, :partial => 'task', :object => Task.new end end end #Task.rb class Task < ActiveRecord::Base belongs_to :project validates_presence_of :name end # Attachments: http://www.ruby-forum.com/attachment/4767/projects_controller.rb_ -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-t...@googlegroups.com. To unsubscribe from this group, send email to rubyonrails-talk+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.