我正在开发一个Rails网站,并希望根据某些条件使用Javascript在我的一些视图中渲染部分内容。例如,如果用户在访问某些页面时没有登录,我希望在模式框中显示Devise登录/登录提示的部分视图。
我在解决这个问题时遇到了很多麻烦 - 第一个问题是我尝试在资产管道中使用render
,经过一些研究发现并没有开始工作。
然后我尝试将js.erb文件放入我的public/javascripts
文件夹,但javascript_include_tag
强制添加' .js'到文件名并使用常规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的正确方法。
答案 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使用和重新显示。