【问题标题】:Rendering Javascripts in Rails without Asset Pipeline在没有资产管道的 Rails 中渲染 Javascript
【发布时间】:2014-08-25 16:53:22
【问题描述】:

我的问题

我正在开发一个 Rails 站点,并希望根据某些条件使用 Javascript 在我的某些视图中呈现部分视图。例如,如果用户在访问某些页面时未登录,我希望在模式框中显示 Devise 登录/登录提示的部分视图。

我在弄清楚这一点时遇到了很多麻烦 - 第一个问题是我尝试在资产管道中使用 render,但经过一些研究发现它一开始就不起作用。

然后我尝试将 js.erb 文件放入我的 public/javascripts 文件夹,但 javascript_include_tag 强制将“.js”附加到文件名并使用常规 src=/javascripts/... 并没有呈现“.erb”的东西,而是它会附加文本<%=j render :partial ... %>

我的解决方案

我在这里提出了这个解决方案,想知道是否有更好的解决方案来保持代码整洁。我将拥有一些其他的 Javascript,它们将在不同的视图上呈现相同的内容。

我创建了一个app/views/shared/javascripts 目录,我将在其中放置[filename].html.erb 文件。

为了让 Javascript 正确运行,我将 <%= render :partial => 'shared/javascripts/...' %> 在任何我想运行该脚本的地方。

在那个脚本里面是这样的:

<script>
    $(document).ready(function() {
        ...
        $(.class).append("<%=j render :partial => 'shared/modal' %>");
        ...
    });
</script>

有更好的方法吗?

据我所知——这会做我想做的事。我只是害怕我看错了。我将在该应用程序的另一部分工作一段时间,我真的希望验证这是可以接受的和体面的,或者找到正确的方法来确保我可以在我的 JS 文件中使用 ERB。

【问题讨论】:

  • 为什么要用js来渲染局部?
  • 这可能是我在脑雾中熬夜太晚并陷入如何做事的想法之一 - 但我正在使用 jQuery 来调出模态框.所以我有我的观点,我有时需要模态 - 那就是我将包含具有脚本标签的shared/javascripts/my.html.erb 的地方 - 该文件中的 JS 然后附加模态(另一个带有 HTML 的 html.erb模态框)到视图。这样写出来听起来有点可笑。有更好的解决方案吗?
  • 是的,为什么不使用 ruby​​ 条件语句,它更简单、更简洁。
  • 我是。在视图中,我只调用在特定条件下渲染部分,即。 customer_logged_in? 设计助手。我的 Javascript 明确用于处理 DOM 操作,方法是采用预先编写的 HTML 代码并将其粘贴在我的视图中。
  • 你的问题是would like to use Javascript to conditionally render partials 那么你能解释一下使用js的具体目的是什么吗?之后将能够更好地帮助您

标签: javascript jquery ruby-on-rails ruby asset-pipeline


【解决方案1】:

我知道这个答案对于 OP 来说晚了 3 年,但我发现这个问题在谷歌上搜索了其他东西,并认为我会回答它,因为这是我们在旧版应用中经常做的事情。

假设您要渲染 javascript alert("Hello, world!")。您可以在文件夹app/views/my_resources 中创建部分_greetings.js.erb

alert('<%= @msg %>')

并从控制器操作中调用它:

@msg = "Hello, world!"
render partial: 'my_resources/greetings', formats: :js

希望对某人有所帮助。

【讨论】:

    【解决方案2】:

    这样做的一种方法是将您的部分放入您的 javascript 中并使用类似Mustache 的东西呈现它。这种方法的问题在于,如果您正在渲染部分内容,那么您也会按照传统方式在 Rails 应用程序的其他地方进行渲染,Mustache 模板很容易与 Rails 部分内容不同步。

    另一种方法是创建一个将渲染的部分作为字符串返回的操作,可以是 XML 格式,也可以是包装在 JSON 中,并使用 AJAX 从该操作请求渲染的部分。然后,您的 Rails 控制器将处理呈现模板(使用 render_to_string)并将其包装在 JSON 中以供您的 javascript 使用和重新显示。

    【讨论】:

    • 感谢您的建议。我决定做的是将我的 Javascript 放在 html.erb 部分的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多