【发布时间】:2017-05-24 23:14:06
【问题描述】:
我在视图中定义了一个辅助函数:
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 代码将根据需要执行。
【问题讨论】:
-
你能指定你的 javascript 文件在哪里以及它的扩展名吗?因为我认为您将 .eex 与 .js 混合在一起,这是不可能的。
-
嘿@emancu 我在问题的更新中添加了信息,正如你所问的。
-
@PatrickOscity 非常感谢您在这个问题上停下来。您对链接问题的回答(基本上将其硬编码为数据属性)非常有帮助。在我需要 javascript 文件中的帖子 url 和帖子标题的情况下,它可以根据需要精确地工作。但是对于这个,尽管您的解决方案会奏效,但硬编码所有用户是不可行的,尤其是当用户列表增加时。
-
@codingbear 是的,你是对的,硬编码在这里不是一个选项,但全局
window对象、数据属性或单独的 JSON 端点是可行的。如果您关心数据属性的大小 - in HTML 5 there is no size limit on attributes,那么您应该没问题。只是想让您知道,将 Elixir 代码嵌入静态资产中并不是 Phoenix 的真正选择,并且存在哪些解决方案来处理这种情况。