[size=large][color=olive]动态的向列表添加项
这里使用一个简单的 tags 表
其实以前我有一个项目作的时候比这个复杂多了, 这里就简单讲一下基本的使用方法,要运用到实际项目中还需要你能触类旁通.
定义一格tags 的表.
db/migrate/001_create_tags.rb:
class CreateTags < ActiveRecord::Migration
def self.up
create_table :tags do |t|
t.column :name, :string
t.column :created_on, :datetime
end
end
def self.down
drop_table :tags
end
end
通过在模型中使用 active Record 校验 可以保证 tag 是唯一的.
app/models/tag.rb:
class Tag < ActiveRecord::Base
validates_uniqueness_of :name
end
在布局中调用prototype.js 和他所对应的样式。
app/views/layouts/tags.rhtml:
<html>
<head>
<title>Tags</title>
<%= javascript_include_tag :defaults %>
</head>
<body>
<%= yield %>
</body>
</html>
在 list.rhtml 中包含新的标签表单核一个 调用局部模版,来显示列表。
app/views/tags/list.rhtml:
<h1>Tags</h1>
<% form_remote_tag(:update => 'list',
:complete => visual_effect(:highlight, 'list'),
:url => { :action => :add } ) do %>
<%= text_field_tag :name %>
<%= submit_tag "Add Tag" %>
<% end %>
<div id="list">
<%= render :partial => "tags", :locals => {:tags => @tags} %>
</div>
局部模版负责生成选择列表,
app/views/tags/_tags.rhtml:
Total Tags: <b><%= tags.length %></b>;
<select name="tag" multiple="true" size="6">
<% i = 1 %>
<% for tag in tags %>
<option value="<%= i %>"><%= tag.name %></option>
<% i += 1 %>
<% end %>
</select>
控制器包含两个动作, 一个是list ,他传递一个存储的标签列表来用作出示显示。 另一个是ADD , 添加新的标签,重新渲染模版。
app/controllers/tags_controller.rb:
class TagsController < ApplicationController
def list
@tags = Tag.find(:all,:order => "created_on desc")
end
def add
Tag.create(:name => params[:name])
@tags = Tag.find(:all, :order => "created_on desc")
render :partial => "tags", :locals => {:tags => @tags}, :layout => false
end
end
[/color][/size]