Warum rails nicht Rendern .js.erb-Datei?
Ich habe eine rails-Anwendung, wo ich versuche, jQuery Rendern MIT einer HTML-Datei. Der Punkt dabei ist, dass die jQuery-spezifisch ist, auf die Seite, so dass ich nicht wollen, dass es be-für jede Seite, indem Sie in der Kopfzeile. Hier ist, was ich getan haben, um die Dateien
messages_controller.rb
# GET /messages/new
def new
@message = Message.new
@users = User.where('id != ' + current_user.id.to_s)
#if @message.save
#MessageMailer.new_message(@message).deliver
respond_to do |format|
format.html # new.html.erb
format.js
end
#end
end
/Nachrichten/neue.html-Code.erb
<div class="row">
<div class="large-12 columns">
<div class="panel">
<h1>New message</h1>
<%= render 'form' %>
<%= link_to 'Back', messages_path, :class => "button small" %>
</div>
</div>
</div>
/Nachrichten/neue.js.erb
$("h1").html('hello'); //for testing that it works
Gibt es etwas, was ich hinzufügen, um eine andere Datei? Gibt es einen Wunsch muss ich machen, damit es lädt die HTML und .js?
- Zusätzlich zu Antworten, sollten Sie diesen Beitrag Lesen : stackoverflow.com/questions/6167805/...
- Dies ist unsicher
User.where('id != ' + current_user.id.to_s)
. VerwendenUser.where('id != ?', current_user.id.to_s)
statt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
, Warum dies nicht funktioniert?
Ich glaube nicht, dass Ihre Methode ist eine besonders übliche Weise zu erreichen, was Sie wollen. Der Grund, warum Ihr JS-template wird nicht geladen, weil Sie Ihr controller-setup zu Antworten, mit einem HTML-template, wenn der browser fordert die HTML-und JS-template, wenn der browser JS. Es wird nie wieder zurückkehren, weil die browser können nur einen Antrag auf eine oder die andere.
In anderen Worten, der respond_to-block in den controller anweist, den controller, wie Sie auf Anfragen reagieren, die für verschiedene Arten von Inhalten, nicht mit einer Liste aller Inhaltstypen, die gesendet werden, auf jede Anfrage.
Lösung 1: Laden Sie die JS auf jeder Seite
Gibt es ein paar Dinge zu beachten hier. Erstens, nur weil JS ist nicht verwendet auf einer bestimmten Seite, ist nicht in sich selbst, ein guter Grund, nicht, um es zu laden. Schienen, die über Kettenräder, wird verketten und minifizieren alle Ihre JS in einer einzigen Datei. Solange diese Datei nicht ändern, dann wird es zwischengespeichert werden durch den browser eines Benutzers. Dadurch werden eine schnellere Reaktion, wenn Ihre Benutzer besucht eine Seite, die nicht verlangen, diese JS, da er nicht brauchen, um eine zusätzliche Anfrage, um die neue JS.
Wenn Sie sind besorgt über Ihre JS läuft auf Inhalte, die es nicht sollten, dann sollten Sie wirklich sein, die Bewachung gegen Sie dies, indem Sie eine eindeutige Kennung für die Seite oder Seiten, auf denen Sie es wollen zu laufen, dann zu erkennen, dass die Bezeichner in deinem JS. Zum Beispiel:
Lösung 2: Verwenden Sie content_for
Allerdings gibt es einige Situationen, in denen es nützlich sein könnte, zum laden von JS getrennt. Der beste Weg, um dies zu erreichen, meiner Meinung nach, ist, um einen Inhalt für den block, fügt Inhalt an den Kopf, wenn eine individuelle Sicht braucht es.
So, in Ihrer Anwendung layout:
messages_new.js wird dann nur aufgenommen, und laufen daher, auf Ansichten, in denen Sie gehören, die content_for block. Sollte es nicht erscheinen auf der anderen Seite.
Lösung 3: fügen Sie Einfach die javascript in Ihrem html -
Alternativ, wenn Sie don ' T care, wenn die JS zuletzt geladen wird, dann können Sie einfach fügen Sie die include-Helfer an der Unterseite des neuen.html-Code.erb:
Aus, was ich verstehe, Sie wollen, um new.html und new.js serviert werden bei der Beantragung /Nachrichten/neue.
Wird es nicht funktionieren, den Schienen-controller verwenden Sie js oder HTML-und nie beides.
HTTP funktioniert nicht so. Sie haben nur eine Datei, die gesendet werden in Antwort auf eine HTTP-Anforderung, und Sie können nicht senden 2 in der gleichen Zeit.
Den Zweck der respond_to-block der Aktion ist die Verwendung von html für html-Anfrage (classic-browsing) und js, wenn die Anforderung für js, und das ist, was Sie verwenden für ajax.
Für das, was Sie wollen, Sie brauchen Sie, um ein js-Referenz in Ihren erb, es gibt keinen anderen Weg.
Sorry, ich bin spät, aber Sie können rufen Sie die JavaScript-in "/Nachrichten/neue.js.erb" durch den Einsatz von:
Nachrichten/neue.html-Code.erb
link_to "Link", "", remote: true
Jedes mal, wenn Sie auf diesen link klicken, wird es Feuer "/Nachrichten/neue.js.erb".
Javascript-code aus den html-Code.erb-Datei, wenn Sie wickeln Sie es in den Skript-tags. Wenn es nur für Testzwecke und nur vorübergehend ist, könnte dies eine schnelle und einfache Möglichkeit, um Feuer Ihre jquery mit Ihrem html-eher als die Schaffung eines neuen, separaten Datei.