sinatraに触れると、だいたい最初の段階でCRUD操作がルーティングのpost/get/put/delete do ... endに対応する、ということを学びます。 しかしながら、多くのブラウザにはgetおよびpostの実装しかないということで、putとdeleteはもうひと工夫必要になります。 この辺りは予備知識があれば容易に分かるところですが、そうでないとなかなか辿り着くのに苦労します。 解決策としては
- POSTによる代用
- Javascriptによるput/deleteメソッドの生成
@@ post_delete form method="POST" action="/destroy_it" input type="hidden" name="_method" value="DELETE" button type="submit" | deleteのようなフォーム(Slim使用)あって、ボタンを押すとPOSTリクエストがサーバには届きますが、delete "/xxxx" do ... end へルーティングされます。 二番目の方法は読んでそのままですが、jQueryを使用すると下記のような形でリクエストを生成します。
$.ajax({ type: "DELETE", url: "destroy_it", success: function(data) { $(".message").text(data) } });以下、両者のサンプルになります。"$ ruby app.rb"で実行できます。
app.rb
require 'sinatra/base' require 'slim' class MyApp < Sinatra::Base configure :development do require 'sinatra/reloader' register Sinatra::Reloader end configure do enable :inline_templates enable :method_override end get '/style.css' do scss :style end get '/post_delete' do slim :post_delete end get '/delete_method' do slim :delete_method end delete '/destroy_it' do content_type :text "delete done!!" end run! if app_file == $0 end __END__ @@ layout doctype html html head title My App script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" link rel="stylesheet" href="/style.css" body == yield @@ post_delete form method="POST" action="/destroy_it" input type="hidden" name="_method" value="DELETE" button type="submit" | delete @@ delete_method span.delete__ | delete div.message javascript: $(function(){ $(".delete__").click(function(){ $.ajax({ type: "DELETE", url: "destroy_it", success: function(data) { $(".message").text(data) } }); }) }) @@ style span.delete__ { cursor: pointer; background-color: #dddddd; border: #cccccc 2px outset; border-radius: 5px; padding: 1px 4px 2px 4px; } div.message { color: red; margin: 2px; padding: 2px; }
0 件のコメント:
コメントを投稿