我在视图中定义了一个辅助函数:
def usernames(id) do
post = Repo.get(Post, id) |> Repo.preload(comments: :user)
usernames = for comment <- post.comments do
comment.user.username
end
end
然后在javascript文件中我做:
$('#comment').doThis({
data: "<%= escape_javascript( MyApp.ApplicationHelpers.usernames(@post.id) ) %>"
});
以上不起作用。当然我需要能够传递@ post.id,但即使通过硬编码MyApp.ApplicationHelpers.usernames(5)
等帖子ID,也无法正常工作。
基本上我正在尝试将Rails等效于:
@usernames = User.pluck(:username)
然后在js.erb中就是:
data = <% @usernames %>
$('#comment').doThis({'data': data});
如果有人可以帮忙解决这个问题......
更新:(提供更多信息)
我将javascript代码放在posts.js
中,如下stackoverflow answer。该文件中的其他javascript代码将根据需要执行。
答案 0 :(得分:2)
好吧@codibgbear就是这样,凤凰将把它作为常规js
文件,这样它就不会编译代码,这意味着你的EEX语法不会起作用。
您可以做的是定义名为_scripts.html.eex
的模板旁边的部分,并添加以下代码
<script>
$('#comment').doThis({
data: "<%= escape_javascript(usernames(@post.id)) %>"
});
</script>
然后在您的模板上,确保渲染此部分。
<%= render "_scripts.html", post: @post %>
实际上,你应该查看你的templates/layout/app.html.eex
文件,看看是否有一行已经神奇地渲染这个文件;)
该行应如下所示:
<%= render_existing view_module(@conn), "_scripts.html", assigns %>
由于您在视图中定义了usernames/1
函数,因此您不需要使用整个模块名称,所以我认为这应该可行。