#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.

Reply via email to