8
votes

Rails 3: Comment envoyer le code JavaScript du contrôleur?

Lorsque foo code> méthode de myController code> est appelé via ajax, il peut renvoyer le code JavaScript comme ceci:

class Job < ApplicationController
  def edit
    if user_type == 'demo'
      [Here I would like to display a Javascript alert saying that 
       the job cannot be edited in demo mode. How would you do this?]
    else
      @job = Job.find(params[:id])
    end
  end
end


1 commentaires

Vous allez contre l'utilisation de Standart des rails et http


3 Réponses :


5
votes

La réponse courte est la suivante: vous ne pouvez pas.

Lorsque vous rendez-vous pour: JS, le code d'appel est un cadre JavaScript qui est conscient que celui-ci a demandé à JS et exécutera le code retourné pour le faire prendre effet lorsque l'appel asychrone exécute son action ergoge.

Lors du rendu de la valeur par défaut, le code d'appel est le navigateur qui s'attend à ce que HTML ne fonctionne pas pure JS.

Ce que vous pouvez faire est de rendre votre point de vue de retour html avec du JavaScript au début par une fenêtre.Onload () défini pour le rendre afficher l'alerte. Mais vous devez toujours retourner le HTML (si vous ne voulez pas afficher les données, faites-la rediriger vers le modèle de vue précédent avec un argument spécifique afin que la vue aura le gestionnaire d'événements) ( https://stackoverflow.com/questions/1033398/execute-javascript- quand-page-a-t-il entièrement chargé )

Vous pouvez également modifier le gestionnaire d'événements qui appelle l'action Modifier pour afficher l'alerte même avant l'exécution de l'action. Pour empêcher un utilisateur de désactiver JS et de passer en revue l'alerte, vous devez toujours effectuer le chèque sur user_type et peut-être simplement rediriger à la page précédente.


2 commentaires

Si je comprends bien, le format de sa demande est pas : JS. C'est HTML. Dans ce cas: la mise à jour est inutile pour lui car je ne pense pas qu'il peut rendu: Mise à jour du format: HTML, d'où ma réponse ...


Oh je l'ai. J'ai raté l'idée principale de la question. +1. Il ne peut pas :)



3
votes

Je vous recommande de conserver votre contrôleur propre et de placer n'importe quel code JavaScript dans un modèle RJS:

contrôleur xxx

edit.js.erb xxx

chaque fois que "code> /my/edit/1.js est appelé (via: edit_my_path ( 1,: format =>: js) ) Le modifier.js.erb serait rendu affichant une alerte.

Chaque fois que tout le code> /my/edit/1.js est appelé (via: edit_my_path (1) ) Le modification.html.erb serait rendu affichant HTML normal.

Si vous auriez besoin de vérifier si la demande est AJAX (et Ainsi, pas seulement un appel normal .js) Vous pouvez, dans votre contrôleur, faites: request.xhr?

espère que cela aide!


3 commentaires

@ Jean travaille dans les deux sens.


D'après ce qu'il veut, il appellera toujours le HTML normal (il a dit: non XHR), il afficherait toujours HTML normal si User_Type est une démonstration ou non. Il pourrait éventuellement utiliser une vérification de la condition dans la page de modèle "Afficher" et utiliser le format JS pour la démo utilise user_type, mais cela n'est pas clair de votre réponse ...


J'aurais peut-être lu toute la question de la question. Et même si s'il utilisait une vérification des conditions dans le modèle, il est à peu près exploitable.



1
votes

Vous pouvez simplement rendre le texte JavaScript sous forme de texte lorsque le format JS est demandé

class MyController < ApplicationController
   def update
      respond_to do |format|
        format.html {}
        format.js { render text: 'alert();' }
      end
   end
 end


1 commentaires

Cela semble donner une action d'action :: mangeTemplate: Modèle manquant Resource_Name / Alert ();