在没有资产管道的Rails中渲染Javascript

时间:2014-08-25 16:53:22

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

我的问题

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

我在解决这个问题时遇到了很多麻烦 - 第一个问题是我尝试在资产管道中使用render,经过一些研究发现并没有开始工作。

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

我的解决方案

我在这里提出了这个解决方案,想知道是否有更好的解决方案来保持代码清洁。我将会有一些其他的Javascripts将在不同的视图中呈现相同的东西。

我创建了一个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的正确方法。

2 个答案:

答案 0 :(得分:1)

我知道对于OP来说,这个答案要晚3年了,但是我发现这个问题在其他地方进行了搜索,并认为我会回答,因为这是我们在旧版应用中所做的很多事情。

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

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

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

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

希望能帮助某人。

答案 1 :(得分:0)

执行此操作的一种方法是将您的部分内容放入javascript中并使用Mustache之类的内容进行渲染。这种方法的问题在于,如果您要渲染部分内容,而且传统上也会在Rails应用程序的其他位置渲染,那么Mustache模板很容易与Rails部分不同步。

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