您的位置:首页 > 职场人生

multimodel_forms 插件用法

2008-10-20 10:46 169 查看
在两个model之间关系为1对多时,希望用于输入的表单的样子是这样:



其中的add_task和delete是js效果。下面以实例来说明如何使用这个插件

1.rails demo -d mysql
2.mysqladmin -u root create demo_development
3.demo> ruby script/plugin install http://multimodel-forms.googlecode.com/svn/trunk/multimodel_forms
4.ruby script/generate model project
5.ruby script/generate model task
==001_Migration

class CreateProjects < ActiveRecord::Migration
def self.up
create_table :projects do |t|
t.column :name, :string
end
end

def self.down
drop_table :projects
end
end

===002_Migration

class CreateTasks < ActiveRecord::Migration
def self.up
create_table :tasks do |t|
t.column :name, :string
t.column :project_id, :integer
end
end

def self.down
drop_table :tasks
end
end

模型:

class Project < ActiveRecord::Base
has_many :tasks, :dependent=>:destroy
has_many_with_attributes :tasks, :dependent=>:destroy
end

class Task < ActiveRecord::Base
belongs_to :project
end

ruby script/generate controller=>projects

配置routes
map.resources :projects

在projects_controller中使用make_resourceful(附件中有下载)

class ProjectsController < ApplicationController
make_resourceful do
actions :all
end
end

projects/index页面:

<h1>Listing Projects</h1>
<%@projects.each do |project|%>
<b>Project Name:</b><%= link_to "#{project.name}", project_path(project)%> <%= %>
<%= link_to "edit", edit_project_path(project) %>
<%= link_to "delete", project_path(project), :method=>"delete", :confirm=>"are you sure?" %>
<ul>
<%project.tasks.each do |task|%>
<li>
<%= task.name %>
</li>
<%end%>
</ul>
<%end%>
<p><%= link_to "New Project", new_project_path %></p>

new页面

<%= javascript_include_tag :defaults %>
<h1>New Project</h1>
<%= error_messages_for :project %>
<%form_for(:project, :url=>projects_path) do |f|%>
<p>
<b>Name:</b><br/>
<%= f.text_field(:name) %>
</p>

<h3>Tasks</h3>
<div id="tasks">
<%= render :partial=>"tasks/task", :collection=>@project.tasks %>
</div>

<%= add_link "Add Task", :task %>
<p><%= submit_tag "Create" %></p>
<%end%>
<%= link_to 'back', projects_path %>

在view下新建一个tasks文件夹,新建一个_task.rhtml局部模板:

<p class="task">
<%fields_for_associated :project , task do |t_form|%>
<%= t_form.text_field :name,:index=>nil %>
<%= delete_link_for(task, "Delete", t_form) %>
<%end%>
</p>
projects/edit.rhtml

<%= javascript_include_tag :defaults %>
<h1>Editing project</h1>
<%= error_messages_for :project %>
<% form_for(:project, :url=>project_path(@project), :html=>{:method=>:put}) do |f|%>
<p>
<b>Name:</b><br/>
<%= f.text_field(:name) %>
</p>

<h3>Tasks</h3>
<div id="tasks">
<%= render :partial=>'tasks/task', :collection=>@project.tasks %>
</div>

<%= add_link "Add Task", :task %>
<p><%= submit_tag "Create" %></p>
<%end%>
show.rhtml

<h1><%= @project.name %>Details</h1>
<%= @project.name %> <%= link_to "edit", edit_project_path(@project) %>
<%= link_to "delete", project_path(@project), :method=>"delete", :confirm=>"are you sure?" %>
<ul>
<% @project.tasks.each do |task| %>
<li><%= task.name %></li>
<%end%>
</ul>现在启动服务, 看看效果吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息