2010-08-23 6 views
4

Pour une raison quelconque, ma méthode "PUT" n'est pas capturée par Sinatra en utilisant ce code html. Quelqu'un peut-il m'aider à repérer l'erreur? Lorsque j'utilise une action "post" dans mon contrôleur, cela fonctionne comme prévu ...La méthode Sinatra PUT ne fonctionne pas?

<form method="post" action="/proposals/<%[email protected]%>/addItem"> 
<input type="hidden" name="_method" value="put"/> 
    <div> 
    <label for="item_id">Item list</label> 
<select title="Item ID" id="item_id" name='item_id'> 
    <%@items.each do |item|%> 
    <option value="<%=item.id%>"><%=item.name%></option> 
    <%end%> 
</select>         
<input type="submit" value="Add"/></div> 
<label for="new_item_name">Create new item</label> 
<input type="text" id="new_item_name" name="new_item_name" /> 
<input type="submit" value="Create"/> 
</form> 
+0

méthode = "post"? – rogerdpack

+0

Tel que requis par le livre Sinatra. –

Répondre

9

Tout semble correct. Il semble que vous ayez mal écrit la chaîne de route, ou qu'elle soit interceptée par une autre route avant votre méthode put. J'étais curieux à ce sujet, alors j'ai écrit une application Sinatra rapide qui utilisait une méthode put, et cela fonctionne vraiment de cette façon.

#!/usr/bin/env ruby 
require 'rubygems' 
require 'sinatra' 

get '/' do 
    <<-eos 
<html> 
    <body> 
    <form action="/putsomething" method="post"> 
     <input type="hidden" name="_method" value="put" /> 
     <input type="submit"> 
    </form> 
    </body> 
</html> 
eos 
end 

put '/putsomething' do 
    "You put something!" 
end 
12

Assurez-vous d'inclure dans votre Rack::MethodOverride config.ru:

use Rack::MethodOverride 
0

Je viens de lancer cette question et aucun des conseils ci-dessus aidé. Ce que je trouve:

La définition de formulaire doit venir d'abord avec l'action = et la seconde avec la méthode =

forme correcte:

<form action="/putsomething" method="POST"> 
    <input type="hidden" name="_method" value="PUT" /> 
... 
</form> 

mauvaise forme:

<form method="POST" action="/putsomething"> 
    <input type="hidden" name="_method" value="PUT" /> 
... 
</form> 

Le d'abord travaillé pour moi, la seconde n'a pas. Peut-être que cela aide.