Как я могу смешать встроенный рубиновый код с моей клиентской 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.

Другие вопросы по тегам