Как я могу смешать встроенный рубиновый код с моей клиентской RJS?
Я использую PrivatePub и испытываю здесь странное поведение. Прежде чем перейти к деталям, обратите внимание, что я использую Ruby 1.9.3
и рельсы 3.2.2
,
Допустим, у меня есть TestsController
:
class TestsController < ApplicationController
def index
end
def create
respond_to do |format|
format.js
end
end
end
А также tests/index.html.erb
:
<h1>Test</h1>
<%= content_for :footer do %>
<%= subscribe_to tests_path %>
<% end %>
А также tests/create.js.erb
:
<% publish_to tests_path do %>
alert("Working fine");
if (false) {alert("This never run");};
if (false) {<% puts "*"*100 %>};
<% end %>
Просто и прямо. Теперь моя проблема в том, что всякий раз, когда я бегу create
действие по какой-то причине <% puts "*"*100 %>
всегда запускать (даже когда я сделал if(false) заявление).
Я знаю, что могу просто использовать рубин if
и тогда должно работать нормально, что-то вроде:
<% if false %>
<% puts "*"*100 %>
<% end %>
Но все же я хочу сделать некоторые проверки на стороне клиента (например, чтобы проверить, что div существует, а затем отобразить некоторые частичные значения соответственно), например:
if ($("#chat").length){
$("#chat").append("<%= j render(@messages) %>");
}
Но кажется <%= j render(@messages) %>
будет оказываться все время.
Как я могу решить эту проблему и использовать клиентскую часть, если внутри оператора и код шаблона ruby? На данный момент кажется, что что-то внутри <%%>
будет срабатывать, и я не хочу такого поведения.
1 ответ
puts "*"*100
всегда печатается, потому что во время обработки вашего js.erb
файл, весь код Ruby внутри файла выполняется.
Код JavaScript выполняется только тогда, когда он выполняется в вашем браузере, поэтому if (false)
Оператор не влияет на обработку файла ERB.
Таким образом, это не имеет ничего общего с гемом PrivatePub, но это потому, что вы смешиваете код JS и Ruby.
Для вашего последнего примера кода (чата), попробуйте render_to_string
, но, возможно, этого недостаточно, потому что @messages
переменная пуста во время компиляции файла JS.
Я хотел бы добавить, что смешивание JS и Ruby может привести к некоторым головным болям. Иногда лучше установить атрибуты данных для ваших элементов HTML с помощью Ruby/ERB в файле представления, а затем позволить коду JS прочитать и использовать значение этих атрибутов данных. Таким образом, вам не нужно использовать код Ruby внутри кода JS.