ã¾ãæ®éã®ãä½ã£ã¦ã¿ãã
åå ãã¦ãMLã®小江戸らぐã®äººãã¡ã§éã¾ã£ã¦æ¯æRailsã®åå¼·ä¼ããã£ã¦ãã¦ã
ããã§è¬å¸«ã¿ãããªäºããã¦é ããããã¦ããã®ã§ããã
8æã®æã«ããã§ãã¢ã³ã¹ãã¬ã¼ã·ã§ã³ããAjaxã使ã£ããµã³ãã«ãµã¤ãã®è§£èª¬ãæ¸ãããã¨ã*1
Railsã¨Ajaxã£ã¦çµæ§è¦ªåæ§é«ããã¼ã£ã¦è©±ããã¾ããã
è¶
é©å½ãªå簿管çã·ã¹ãã ãä½ãã¾ãã
ååç»é²ããå¾ãé
ç®ãã¯ãªãã¯ããã°ç·¨éãããã
åé¤ãæ¼ãã¦ãã¼ã¿ãåé¤ããããã
D&Dã§ä¸¦ã³æ¿ãã§ãããããªãµã¤ãã§ãã
以ä¸ãéçºæé ã¨ãã*2
éä¸ãé çªã«ãã£ã¦ãã®ã§æé ãå¤ããªã£ã¦ã¾ããã
é¢åãªäººã¯1ã4ã¨ã11ããå®è¡ãã¦ãã ããã
å®æãã¾ãã
1.Railsã§ããã°ã©ã ãä½ãã¾ãã
$ rails ajax
ã¤ãã¤ãã¼ã£ã¨ãã¡ã¤ã«ãåºæ¥ä¸ããã¾ããã
create create app/controllers create app/helpers create app/models create app/views/layouts create config/environments create components create db create doc create lib create lib/tasks create log create public/images create public/javascripts create public/stylesheets create script/performance create script/process create test/fixtures create test/functional create test/integration create test/mocks/development create test/mocks/test create test/unit create vendor create vendor/plugins create tmp/sessions create tmp/sockets create tmp/cache create tmp/pids create Rakefile create README create app/controllers/application.rb create app/helpers/application_helper.rb create test/test_helper.rb create config/database.yml create config/routes.rb create public/.htaccess create config/boot.rb create config/environment.rb create config/environments/production.rb create config/environments/development.rb create config/environments/test.rb create script/about create script/breakpointer create script/console create script/destroy create script/generate create script/performance/benchmarker create script/performance/profiler create script/process/reaper create script/process/spawner create script/process/inspector create script/runner create script/server create script/plugin create public/dispatch.rb create public/dispatch.cgi create public/dispatch.fcgi create public/404.html create public/500.html create public/index.html create public/favicon.ico create public/robots.txt create public/images/rails.png create public/javascripts/prototype.js create public/javascripts/effects.js create public/javascripts/dragdrop.js create public/javascripts/controls.js create public/javascripts/application.js create doc/README_FOR_APP create log/server.log create log/production.log create log/development.log create log/test.log
2.DBãä½æãã¾ãã
$ mysql -u ã¦ã¼ã¶ã¼å Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 66 to server version: 5.0.22 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> create database ajax_development character set utf8;
大ä½ããã©ãããã®ã§ããã¤ãã¢ããªå_ç°å¢ã§DBãä½ã£ã¦ã¾ãã
ä»åã¯ajax_developmentã§ãã
ãã®è¾ºã®ãDBç°å¢ã¯ãèªåã®ä½ã£ãrailsã®ç°å¢ã«åããã¦é©å½ã«æ¸ãæãã¦ãã ããã*3
3.åç°¿ç¨ã®ã¢ãã«ãä½æãã¾ãã
generateãå®è¡ã
$ ruby script/generate model Member name:string atitude:string position:integer
ããã§ãã¤ã°ã¬ã¼ããã¡ã¤ã«ã¨ãã¢ãã«ãåºæ¥ä¸ããã¾ããã*4
exists app/models/ exists test/unit/ exists test/fixtures/ create app/models/member.rb create test/unit/member_test.rb create test/fixtures/members.yml exists db/migrate create db/migrate/001_create_members.rb
db:migrateãå®è¡ãã¾ãã
rake migrate
ãã¼ãã«åºæ¥ä¸ããã°æåã§ãã
== CreateMembers: migrating =================================================== -- create_table(:members) -> 0.0633s == CreateMembers: migrated (0.0650s) ==========================================
4.ã³ã³ããã¼ã©ãä½æãã¾ãã
generateãå®è¡*5
ruby script/generate controller Test list
å¿ è¦ãªãã¡ã¤ã«ãåºæ¥ä¸ããã¾ãã
exists app/controllers/ exists app/helpers/ create app/views/test exists test/functional/ create app/controllers/test_controller.rb create test/functional/test_controller_test.rb create app/helpers/test_helper.rb create app/views/test/list.rhtml
5.ã¾ãã¯ä¸è¦§è¡¨ãä½ã£ã¦ã¿ãã
ã¾ãã¯æ®éã«ãlist 㨠追å ã ãä½ãã¾ãã
4ã§ä½æããã app/controllers/test_controller.rb ãç·¨éãã¾ãã
class TestController < ApplicationController def list @members = Member.find(:all) end def add @member = Member.new(params[:member]) @member.save! unless @member.name.blank? redirect_to :action=>'list' end end
<html> <head> <title> å簿管çã¢ããªã±ã¼ã·ã§ã³ </title> </head> <body> <hr> <ul id="members"> <% for @member in @members %> <li id="member_<%=@member.id %>" > åå : <%= h @member.name %> / ã©ããªäºº : <%= h @member.atitude %> </li> <% end %> </ul> <hr> <%= form_tag :action => 'add' , :id => @member %> <p>åå <%= text_field 'member','name' %>ã©ããªäºº <%= text_field 'member','atitude' %><%= submit_tag 'ç»é²' %></p> <%= end_form_tag %> </body> </html>
ããã§ãåç°¿ã«ååã追å ãã¦ããã ãã®ã¢ããªã±ã¼ã·ã§ã³ãåºæ¥ä¸ããã¾ããã
ã¾ã ãå ¨ç¶Ajaxã£ã½ããªãã®ã§ãã¡ãã£ã¨ãã¤ããã«ã«ã¹ã¿ãã¤ãºãã¦ããããã¨æãã¾ãã
*1:ä¸ã¶æåé ããã©ãã ãé ãã¦ããã â¦â¦ã
*2:linuxã§éçºãã£ã¦ããã®ã§ãwindowsã®äººã¯é©åº¦ã«èªã¿æ¿ãã¦ãã ããã
*3:æ¥æ¬èªã使ã人ã¯config/environment.rbã«$KCODE='u'ã¨ãã®è¨è¼ããããããé¡ããã¾ãã
*4:generaterã¯ä¾¿å©ããã¾ãã
*5:list.rhtmlãä½ããªãããããªãã®ã§ä»ã®ãã¡ã«æå®ãã¦ã¾ãã
次ã«ãin_place_editor_fieldã§åä¸ç»é¢ç·¨éåºæ¥ãæ§ã«ããã
ä»ã®ã¾ã¾ããç»é²ããåºæ¥ãªãã®ã§ãç·¨éåºæ¥ãããã«ãã¾ãã
ããããã¯Ajaxã½ãããã¦ã¹ã¯ãªãã¯ã§ãã¼ã¿ãæ¸ãããããæ§ã«ãã¾ãã
(åé¤ã¯æ¬¡ã®æ®µéã§ããã¾ããã)
6.javascriptã®ãã¡ã¤ã«ãè¨å®ããã
Ajaxãå©ç¨ããã®ã§ãAjaxç¨ã®javascriptãã¡ã¤ã«ãèªã¿è¾¼ãæ§ã«ãã¾ãã
app/views/test/list.rhtmlã«ã<%= javascript_include_tag :defaults %>
ã¨è¨ãä¸è¡ã追å ãã¾ãã(ä¸ããäºè¡ç®)
<html> <head> <title> å簿管çã¢ããªã±ã¼ã·ã§ã³ </title> <%= javascript_include_tag :defaults %> </head> <body> <hr> <ul id="members"> <% for @member in @members %> <li id="member_<%=@member.id %>" > åå : <%= h @member.name %> / ã©ããªäºº : <%= h @member.atitude %> </li> <% end %> </ul> <hr> <%= form_tag :action => 'add' , :id => @member %> <p>åå <%= text_field 'member','name' %>ã©ããªäºº <%= text_field 'member','atitude' %><%= submit_tag 'ç»é²' %></p> <%= end_form_tag %> </body> </html>
7.in_place_editor_fieldãç»é²ããã
in_place_editor_fieldã¨è¨ãrailsã®ãã«ãã¼ã使ãã¾ãã
ã¯ãªãã¯ããã¨ãã®å ´æãç·¨éåºæ¥ãajaxãæä¾ãã¦ãããåªãç©ã§ãã
ãªãã¨1è¡ã§æ¸ããã§ããâ¦â¦ã
ä¸ç¤ã®ååãã©ããªäººã®é
ç®ãã hã§ã®è¡¨ç¤ºããin_place_editor_fieldã«ç½®ãæãã¾ãã
ä¿åããã¨ãã®ãã¿ã³ã®ååãsave_textã§æå®ãã¦ã¾ãã
åãæ¶ãã®éã®ãªã³ã¯ã®ååã¯cancel_textã§ã
<html> <head> <title> å簿管çã¢ããªã±ã¼ã·ã§ã³ </title> <%= javascript_include_tag :defaults %> </head> <body> <hr> <ul id="members"> <% for @member in @members %> <li id="member_<%=@member.id %>" > åå : <%= in_place_editor_field :member, 'name' , {}, { :save_text=>"ä¿å", :cancel_text=>"åæ¶" } %> / ã©ããªäºº : <%= in_place_editor_field :member, 'atitude' , {}, { :save_text=>"ä¿å", :cancel_text=>"åæ¶" } %> </li> <% end %> </ul> <hr> <%= form_tag :action => 'add' , :id => @member %> <p>åå <%= text_field 'member','name' %>ã©ããªäºº <%= text_field 'member','atitude' %><%= submit_tag 'ç»é²' %></p> <%= end_form_tag %> </body> </html>
8.Webãµã¼ãå´ã®åãç¿ãä½ã
ä»ã®ã¾ã¾ã ã¨ãã©ã¦ã¶ä¸ã§ç·¨éåºæ¥ãæ§ã«è¦ããã®ã§ãããå®éã«ã¯DBã«
ç»é²ããWebå´ã®åãç¿ããªãã®ã§ãã³ã³ããã¼ã©ã¼ã«ãããä½ãã¾ãã
ãã£ã±ããã¡ããrailsã®æ©è½ã使ãã¨1é
ç®ããã1è¡ã§ãã¿ã¾ãã
in_place_edit_for ãè¨è¼ãã¾ãã
ã³ã³ããã¼ã©ã¼ãããªæãã«ãªãã¾ãã
ä»åã¯2é
ç®ã¡ã³ãç»é¢ç¨æãã¦ãã®ã§ã2è¡ç®ã3è¡ç®ã追å ãã¦ãã¾ãã
class TestController < ApplicationController in_place_edit_for :member, :name in_place_edit_for :member, :atitude def list @members = Member.find(:all) end def add @member = Member.new(params[:member]) @member.save! unless @member.name.blank? redirect_to :action=>'list' end end
ããã§ã¯ãªãã¯ã§ã®ç·¨éã¯å®æã§ãã
åé¤æ©è½ãrjsã§å®è£ ãã¦ã¿ãã
次ã¯ãAjaxã£ã½ããè¡åé¤ãå®è£
ãã¾ãã
Railsã®RJSæ©è½ãå©ç¨ãã¾ãã
9.link_to_remoteã§ãªã¯ã¨ã¹ãï¼ï¼
Ajaxã¸ãªã¯ã¨ã¹ããæããçºã«Aã¿ã°ãå©ç¨ãã¦ã¤ãã³ããä½ãã¾ããã
æ®éã«a href="URL"ã ã¨ç»é¢ãåãæ¿ããã¾ãã
a href="#" onclick="new Ajax.Request ... ã¨ãAjaxç³»ã®ãªã¯ã¨ã¹ãã
çæããã¤ãã³ããè¨è¼ããå¿
è¦ãããã¾ããããã¯ãRailsã® link_to_remote ã
使ãã¨æ¥½ã«ããã¾ãã
link_to_remote("ãªã³ã¯å", :url => { URLã¨ãªãã·ã§ã³ })
ãããªãã§OKã§ãã
ä»ã¾ã§ä½ã£ã¦ãapp/views/test/list.rhtmlã®ãªã¹ã表示é¨åã«ãåé¤ã¸ã®ãªã³ã¯ã
ä½ã£ã¦ã¿ã¾ãã
<html> <head> <title> å簿管çã¢ããªã±ã¼ã·ã§ã³ </title> <%= javascript_include_tag :defaults %> </head> <body> <hr> <ul id="members"> <% for @member in @members %> <li id="member_<%=@member.id %>" > åå : <%= in_place_editor_field :member, 'name' , {}, { :save_text=>"ä¿å", :cancel_text=>"åæ¶" } %> / ã©ããªäºº : <%= in_place_editor_field :member, 'atitude' , {}, { :save_text=>"ä¿å", :cancel_text=>"åæ¶" } %> / <%= link_to_remote("åé¤", :url => { :action => :del,:id => @member.id }) %> </li> <% end %> </ul id="members"> <hr> <%= form_tag :action => 'add' , :id => @member %> <p>åå <%= text_field 'member','name' %>ã©ããªäºº <%= text_field 'member','atitude' %><%= submit_tag 'ç»é²' %></p> <%= end_form_tag %> </body> </html>
10.åé¤ããã¡ã½ãããä½æ
ã¢ãããã¼ãã¨åæ§ãåé¤ã®åãç¿ãå¿
è¦ã«ãªãã¾ãã
ã¨è¨ãããã§delã¡ã½ãããä½æãã¾ãã
ä»åã¯ãéããã¦ãããã©ã¡ã¼ã¿ã®DBãåé¤ããã ããªã®ã§ããã®ã¾ã¾æ¸ãäºã«ã*1
class TestController < ApplicationController in_place_edit_for :member, :name in_place_edit_for :member, :atitude def list @members = Member.find(:all , :order => "position") end def add @member = Member.new(params[:member]) @member.save! unless @member.name.blank? redirect_to :action=>'list' end def del Member.find(params[:id]).destroy end end
11.RJSãå®è£
ããã
RJSã§ãé¸æãããè¡ãåé¤ããã¡ã½ãããå®è£
ãã¾ãã
app/views/test/del.rjs ã¨è¨ããã¡ã¤ã«ãä½æãã¾ãã
ã¨è¨ã£ã¦ã1è¡ã§ãã
member_idã®è¡ãåé¤ããã¼ã£ã¦å½ä»¤ã§ãã
page.remove "member_" + params[:id]
ããã§ãåé¤ãã¿ã³ãæ¼ãã¨ç»é¢ä¸ãããDBä¸ããããã®è¡ãåé¤åºæ¥ãæ§ã«ãªãã¾ããã
*1:ä¾å¤å¦çã¯ç¡è¦ãã¦ã¾ããããã©ããªã®ã§ã»ã»ã»ã»ã»ãä½ã
D&Dã§ã½ã¼ãåºæ¥ãæ§ã«ããã
sortable_elementã«ãããã½ã¼ãå¦çãå®è£
ãã¾ãã
ç¸å¤ãããããã«ãã¼ä½¿ãã¾ããã§ãã
12.sortable_elementãrhtmlã«é
ç½®ã
sortable_elementãã«ããå©ç¨ãã¦ã½ã¼ãé ãå¼ãæ§ã«è¿½å ãã¾ãã
<html> <head> <title> å簿管çã¢ããªã±ã¼ã·ã§ã³ </title> <%= javascript_include_tag :defaults %> </head> <body> <hr> <ul id="members"> <% for @member in @members %> <li id="member_<%=@member.id %>" > åå : <%= in_place_editor_field :member, 'name' , {}, { :save_text=>"ä¿å", :cancel_text=>"åæ¶" } %> / ã©ããªäºº : <%= in_place_editor_field :member, 'atitude' , {}, { :save_text=>"ä¿å", :cancel_text=>"åæ¶" } %> / <%= link_to_remote("åé¤", :url => { :action => :del,:id => @member.id }) %> </li> <% end %> </ul id="members"> <hr> <%= form_tag :action => 'add' , :id => @member %> <p>åå <%= text_field 'member','name' %>ã©ããªäºº <%= text_field 'member','atitude' %><%= submit_tag 'ç»é²' %></p> <%= end_form_tag %> <%= sortable_element 'members',:url => { :action => "sort" } , :complete => visual_effect(:highlight, 'members',:duration => 0.5) %> </body> </html>
13.æ¯åº¦ã®ãã¨ãåãç¿ãã»ã»ã»ã
ã½ã¼ãé ãä¿åããsortã¡ã½ãããå®è£
ãã¾ãã
class TestController < ApplicationController in_place_edit_for :member, :name in_place_edit_for :member, :atitude def list @members = Member.find(:all , :order => "position") end def add @member = Member.new(params[:member]) @member.save! unless @member.name.blank? redirect_to :action=>'list' end def del Member.find(params[:id]).destroy end def sort params[:members].each_with_index do | member, idx | sort_member = Member.find(member) sort_member.position = idx + 1 sort_member.save end render :nothing => true end end
ããã§å®æã§ãã
éããã¦ãããã©ã¡ã¼ã¿ãå
ã«ãã½ã¼ãé ãä¿åãã¦ã¾ãã
æçµçã«ä½ã£ããã¡ã¤ã«
app/contorllers/test_controller.rb
class TestController < ApplicationController in_place_edit_for :member, :name in_place_edit_for :member, :atitude def list @members = Member.find(:all , :order => "position") end def add @member = Member.new(params[:member]) @member.save! unless @member.name.blank? redirect_to :action=>'list' end def del Member.find(params[:id]).destroy end def sort params[:members].each_with_index do | member, idx | sort_member = Member.find(member) sort_member.position = idx + 1 sort_member.save end render :nothing => true end end
app/views/test/list.rhtml
<html> <head> <title> å簿管çã¢ããªã±ã¼ã·ã§ã³ </title> <%= javascript_include_tag :defaults %> </head> <body> <hr> <ul id="members"> <% for @member in @members %> <li id="member_<%=@member.id %>" > åå : <%= in_place_editor_field :member, 'name' , {}, { :save_text=>"ä¿å", :cancel_text=>"åæ¶" } %> / ã©ããªäºº : <%= in_place_editor_field :member, 'atitude' , {}, { :save_text=>"ä¿å", :cancel_text=>"åæ¶" } %> / <%= link_to_remote("åé¤", :url => { :action => :del,:id => @member.id }) %> </li> <% end %> </ul id="members"> <hr> <%= form_tag :action => 'add' , :id => @member %> <p>åå <%= text_field 'member','name' %>ã©ããªäºº <%= text_field 'member','atitude' %><%= submit_tag 'ç»é²' %></p> <%= end_form_tag %> <%= sortable_element 'members',:url => { :action => "sort" } , :complete => visual_effect(:highlight, 'members',:duration => 0.5) %> </body> </html>
app/views/test/del.rjs
page.remove "member_" + params[:id]
app/models/member.rb
class Member < ActiveRecord::Base end
db/migrate/001_create_members.rb
class CreateMembers < ActiveRecord::Migration def self.up create_table :members do |t| t.column :name , :string t.column :atitude , :string t.column :position , :integer end end def self.down drop_table :members end end
ããã§ããµã¤ããä½ãã¾ãã
ã¡ãªã¿ã«ãã®ããã°ã©ã èªä½ã¯ãåå¼·ä¼ã®åæ¥ã«ï¼æéãããããã¦èª¿ã¹ã¤ã¤ã¤ãã£ã¦ã¾ããã