【问题标题】:Ruby variables in JavaScript snippet not working with Slim langJavaScript 片段中的 Ruby 变量不适用于 Slim lang
【发布时间】:2014-04-15 19:25:21
【问题描述】:

现在这让我整了整整两个晚上都抓狂了——我正在为 Intercom.io 安装 JavaScript,这需要在结束 </body> 标记之前放置一段 sn-p 代码,像这样:

<script id="IntercomSettingsScriptTag">
window.intercomSettings = {
// TODO: The current logged in user's email address.
email: "john.doe@example.com",
// TODO: The current logged in user's sign-up date as a Unix timestamp.
created_at: 1234567890,
app_id: [redacted]
</script>

听起来很简单,但我的问题是我需要使用 Ruby 变量将当前登录用户的电子邮件地址交换到 email 字段 - 它应该只是一个简单的 #{@user.full_name}(或者至少我认为是的,我只是个初学者)。

但是,Slim 阻止我这样做,因为它不执行变量,它只是在浏览器的源代码中按原样打印整个代码 sn-p。我认为这个问题类似于这个问题:How to access instance variables in CoffeeScript engine inside a Slim template

这是我的 Slim 代码:​​

|<script id="IntercomSettingsScriptTag">
 window.intercomSettings = {
 // TODO: The current logged in user's email address.
 email: "#{@user.email}",
 // TODO: The current logged in user's sign-up date as a Unix timestamp.
 created_at: #{@user.created_at.to_i},
 app_id: [redacted]
 };
 </script>

上述情况使 Slim 崩溃,页面甚至无法加载。我也尝试使用javascript: Slim 函数在 sn-p 之前声明变量,如上面的链接中所示。没有运气。

还有其他人对如何将变量传递到 JavaScript 有任何想法吗?非常感谢一些指点。谢谢!

已解决

这是有效的代码:

- if user_signed_in?
  script id="IntercomSettingsScriptTag"
    |
      window.intercomSettings = {
      // TODO: The current logged in user's full name
      name: "#{@current_user.full_name}",
      // TODO: The current logged in user's email address.
      email: "#{@current_user.email}",
      // TODO: The current logged in user's sign-up date as a Unix timestamp.
      created_at: #{@current_user.created_at.to_i},
      app_id: "eac384da45babdcac214d669601f1a29632f0d97"
      };

【问题讨论】:

    标签: javascript ruby-on-rails ruby slim-lang


    【解决方案1】:

    这可能会解决它

    script id="IntercomSettingsScriptTag"
      |
        window.intercomSettings = {
          // TODO: The current logged in user's email address.
          email: "#{@user.email}",
          // TODO: The current logged in user's sign-up date as a Unix timestamp.
          created_at: #{@user.created_at.to_i},
          app_id: [redacted]
        };
    

    【讨论】:

    • 解决了,非常感谢!我也使用了错误的变量——我实际上需要#{@current_user.email}。不过我有一个新问题——如果没有用户登录,Slim 会抛出一个错误,因为当前用户没有变量并且页面不会加载。我现在能做什么?!
    • 您可以在加载代码之前设置它:current_user ||= '' 它会强制 current_user 获取一个空变量(如果您在 current_user 上使用方法,这将不起作用)您还可以设置一个三元用于测试当前用户是否存在的表达式:current_user ? current_user.email : ''(我认为最好的解决方案)最后但并非最不重要的一点是,如果您仅将 current_user 用于少数方法,您可以为每个方法执行此操作:current_user.try(:email),以防止出现任何异常.
    【解决方案2】:

    是的,非常感谢您的提示!这就是最终对我有用的方法:

    - if user_signed_in?
      script id="IntercomSettingsScriptTag"
        |
          window.intercomSettings = {
          // TODO: The current logged in user's full name
          name: "#{@current_user.full_name}",
          // TODO: The current logged in user's email address.
          email: "#{@current_user.email}",
          // TODO: The current logged in user's sign-up date as a Unix timestamp.
          created_at: #{@current_user.created_at.to_i},
          app_id: "eac384da45babdcac214d669601f1a29632f0d97"
          };
    

    我只是一个初学者,所以看到它正常工作真的很令人兴奋。神奇!

    【讨论】:

    • 我很高兴为您提供帮助 ;) 在 StackOverflow 中,作为提出问题的人(除非没有人回答正确),您不应该发布答案,而是编辑您的第一篇文章举例来说。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多