0

我正在使用PrivatePub,我在这里遇到了一些奇怪的行为。在详细介绍之前,请注意我使用的是 Ruby1.9.3和 Rails 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) 语句)。

我知道我可以只使用 ruby if​​,然后应该可以正常工作,例如:

  <% if false %>
    <% puts "*"*100 %>
  <% end %>

但我仍然想做一些客户端验证(例如检查 div 是否存在,然后相应地渲染一些部分),例如:

if ($("#chat").length){
  $("#chat").append("<%= j render(@messages) %>");
}

但似乎<%= j render(@messages) %>会一直呈现。

我该如何解决这个问题并在里面使用客户端 if 语句和 ruby​​ 模板代码?目前看来里面的任何东西<%%>都会被触发,我不想要这种行为。

4

1 回答 1

1

puts "*"*100总是打印,因为在处理js.erb文件期间,文件中的所有 Ruby 代码都会被执行。

JavaScript 代码仅在您的浏览器中运行时才会执行,因此该if (false)语句在文件的 ERB 处理期间不起作用。

因此,这与 PrivatePub gem 无关,而是因为您将 JS 和 Ruby 代码混合在一起。

对于您的最后一个(聊天)代码示例,请尝试render_to_string,但这可能还不够,因为@messages在编译 JS 文件期间该变量为空。

我想补充一点,混合使用 JS 和 Ruby 会让人头疼。有时最好在视图文件中使用 Ruby/ERB 在 HTML 元素上设置数据属性,然后让 JS 代码读取并使用这些数据属性的值。这样您就不必在 JS 代码中使用 Ruby 代码。

于 2015-11-17T16:42:24.407 回答