2014-09-21 3 views
-1

Cela a été demandé à quelques reprises, cependant, il semble y avoir aucune bonne réponse sur le web. Pour éviter les réponses ou les liens qui ne répondent pas à cette question, je vais le reformuler. Une page a seulement un formulaire avec le texte d'entrée (et le bouton). Nous publions du texte sur le serveur et nous voulons juste le renvoyer et l'alerter. En d'autres termes, la vue doit avoir la ligne:AJAX peut-il être utilisé avec Sinatra?

$.post(...,$("form").serialize(),function(reply){alert(reply);}); 

Avec PhP, la réponse est un « écho » one-liner. Cela peut-il être fait dans Sinatra? Je comprends que les frameworks backend sont construits autour de la manipulation de la manipulation DOM eux-mêmes. Je pose cette question parce que ce serait bien d'utiliser un langage plus expressif comme Ruby aussi juste pour la logique db interface/backend.

Modifier: C'est le /views/index.erb (avec "/ réponse" à la place de "reply.php" - autrement index.html/index.php) partie:

<script src="jquery"></script> 

<form action="reply.php" method="post"><input type="text" name="t"></form> 

<script> 
$(document).ready(function(){ 
    $("form").submit(function(event){ 
     event.preventDefault(); 
     $.post("reply.php",$("form").serialize(),function(reply){alert(reply);}); 
    }); 
}); 
</script> 

Notez que avec nous event.preventDefault() rester à / route et ne vont pas dans /reply.php, qui supprimerait le formulaire et n'imprimerait que le texte soumis. En d'autres termes, c'est ce qui permet à l'Ajax et nous obtenons une réponse (seulement en alerte) du serveur avec reply.php:

echo $_POST["t"]; 

Avec Sinatra, nous devons avoir un contrôleur routes.rb:

require 'sinatra' 

get '/' do 
    erb :index 
end 

post '/reply' do 
    ... 
end 

Question: Avec index.html/reply.php nous recevons une alerte avec le texte posté. Comment index.erb/routes.rb peut-il être modifié également pour obtenir une alerte avec le texte posté?

+1

Oui, cela peut être fait dans Sinatra. Cependant, vous semblez vouloir de l'aide spécifique avec quelque chose sur le front end. Il n'y a pas assez de détails ici pour deviner ce dont vous avez réellement besoin. Je vote pour fermer. –

+0

@ Mark Thomas J'ai édité ma question de oui/non à comment. – observer

+0

C'est une meilleure question maintenant. Voter pour rouvrir. –

Répondre

2

Oui, cela peut être fait avec Sinatra. Toute route peut renvoyer des données du serveur au client; par défaut, il est envoyé avec un type MIME text/html, mais vous pouvez également retourner le texte brut avec un type MIME approprié:

post "/reply.php" do 
    content_type :text 
    params['t'] 
end 

Si vous voulez faire écho à plus d'une valeur de retour, vous pouvez voir toutes les valeurs de demande en utilisant le code de this question.

Cela va renvoyer la valeur de votre variable à partir du serveur, et le code JavaScript côté client que vous avez dans votre question provoquera une alerte() pour apparaître.

+0

Merci pour la réponse! Le bloc que vous avez suggéré fonctionne, mais un itinéraire est requis qui remplace la transmission de la réponse à l'alerte. Comment faire sortir l'alerte? – observer

+1

@observer vous semblez être confus quant à ce qui se passe sur le navigateur par rapport au serveur. Le "écho" ci-dessus est la route, et peut être n'importe quoi, par ex. "/ api/v1/echo". L'alerte se produit dans le navigateur. Tout ce que JS appelle le service d'écho backend peut déclencher une alerte dans le navigateur. –

+0

@Mark Thomas Je comprends que nous avons posté "/ route" do ... se termine par

et $ .post ("/ route", ..., ...). Ma question est la suivante: quel est le service d'écho possible pour déclencher l'alerte ou n'est-ce pas possible parce que le framework est une structure rigide avec des routes? – observer

Questions connexes