2009-02-20 9 views
1

Dans mon application Rails, j'essaie de créer un formulaire permettant aux utilisateurs de créer un signet.Can Rails/Mongrel accepte un formulaire POST avec un champ texte dont la valeur est une URL

<% form_tag(contents_path) do %> 
    <input name='item_type' value="Bookmark" type="hidden" /></p> 
    <h3>Create New Bookmark</h3> 
    <p>Title:<input name='item[title]' type="text" /></p> 
    <p>URL:<input name='item[url]' type="text" /></p> 
    <%= submit_tag 'Create' %> 
<% end %> 


Edit: Pour plus de clarté, voici le code HTML réel généré par le modèle ci-dessus:

<form action="/contents" method="post"><div style="margin:0;padding:0"><input name="authenticity_token" type="hidden" value="cc709c404365f1a5754a7bf0c3fe79ce9ec9f96b" /></div> 
    <input name='item_type' value="Bookmark" type="hidden" /></p> 
    <h3>Create New Bookmark</h3> 
    <p>Title:<input name='item[title]' type="text" /></p> 
    <p>URL:<input name='item[url]' type="text" /></p> 
    <input name="commit" type="submit" value="Create" /> 
</form> 

Comme vous pouvez le voir est une forme tout à fait normal.


Il fonctionne très bien, sauf si une URL réelle est entré, dans ce cas, le serveur ne répond jamais et je reçois un message dans mon fichier mongrel.log

Error reading HTTP body: #<RuntimeError: Socket read return nil> 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel/http_request.rb:105:in `read_socket' 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel/http_request.rb:77:in `read_body' 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel/http_request.rb:55:in `initialize' 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel.rb:149:in `new' 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel.rb:149:in `process_client' 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel.rb:285:in `run' 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel.rb:285:in `initialize' 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel.rb:285:in `new' 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel.rb:285:in `run' 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel.rb:268:in `initialize' 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel.rb:268:in `new' 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel.rb:268:in `run' 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel/configurator.rb:282:in `run' 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel/configurator.rb:281:in `each' 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel/configurator.rb:281:in `run' 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/mongrel_rails:128:in `run' 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel/command.rb:212:in `run' 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/mongrel_rails:281 
/usr/bin/mongrel_rails:16:in `load' 
/usr/bin/mongrel_rails:16 

Comme on le voit la demande atteint jamais mon code de contrôleur.

J'ai depuis découvert que l'envoi de n'importe quelle forme où une valeur de champ commence par la chaîne "http: /" provoque le problème. mettre d'autres caractères ou des espaces blancs avant de résoudre le problème. J'ai également essayé ceci dans d'autres applications de Rails (sur le même serveur) avec le même résultat.

Il est donc possible de contourner le problème en insérant un espace supplémentaire au début de la chaîne et en l'effaçant sur le serveur.

Mais je préférerais une solution côté serveur uniquement si cela est possible. J'espère que c'est simplement une mauvaise configuration sur le serveur. Je suis sous Rails 2.1.0 sur un arrangement d'hébergement partagé basé sur CPanel. Pourquoi pas un form_for au lieu de form_tag?

+0

Ce comportement n'est pas attendu et n'est pas conforme à mon expérience. Nous aurons besoin de voir tout le code associé à l'action, et de savoir quelle version de Rails vous utilisez. – womble

+0

J'ai changé mon Q pour afficher la trace complète de la pile, comme vous pouvez le voir, elle ne parvient pas à mon code. J'ai juste essayé d'entrer "http: //" dans quelques formes aléatoires dans certaines de mes autres applications de rails fonctionnant sur le même serveur et j'ai eu le même problème. donc ce n'est pas spécifique à cette forme/action. –

Répondre

4

La trace de la pile montre qu'elle n'a pas chargé le code Rails lorsqu'elle est tombée, donc ce n'est probablement pas un problème avec votre code ou Rails lui-même. Ma conjecture est que votre hôte utilise quelque chose comme mod_security qui pense que votre demande semble suspecte et mange les données sur vous.

Je n'ai eu aucun problème avec la saisie d'URL via des formulaires à la fois par Mongrel et Passenger sur Apache, bien que cela ait été fait sur un serveur dédié autogéré.

+0

Merci, mod_security me donne quelque chose à chasser, je vais demander le support si elles utilisent quelque chose comme ça. Aussi, je vais essayer de mettre en place un simple programme CGI et voir si cela souffre du même problème. –

+0

On dirait que vous avez raison, ce problème est dû à mod_security. Le département de support de l'entreprise d'hébergement est sur le cas. –

1

Je viens de travailler sur quelque chose de similaire et je n'ai jamais eu de problème à publier des URL complètes. Un problème que j'ai est que vous nous montrez le formulaire de soumission mais aucun du code du contrôleur qui est plus que probable où la rupture est.

+0

Je n'ai pas envoyé le code du contrôleur parce que quand il échoue, il n'atteint jamais le contrôleur, en fait j'ai enlevé tout le code du contrôleur sauf pour écrire un message à flash et faire un redirect_to: retour –

+0

La raison pour laquelle je n'ai pas utilisé form_for est parce que je n'ai pas d'objet prototype au moment où le formulaire est créé. La page contient plusieurs formes de ce type qui sont masquées jusqu'à ce qu'un utilisateur clique sur l'icône "Créer un nouveau widget" associée. –

Questions connexes