如果用户在场,则运行coffeescript

时间:2016-03-09 14:40:32

标签: ruby-on-rails

我试图找到一种方法,只有在用户登录时才运行特定的coffeescript代码。有没有办法实现这一点,而不必包含特定的coffeescript文件。例如,检查是否找到了值为user_id的会话cookie,然后运行这段代码。

目标是删除一些内联JavaScript并将其移至资源。

2 个答案:

答案 0 :(得分:1)

Rails默认使用ActionDispatch::Session::CookieStore所以理论上你可以读取cookie并获取用户ID。但是,为了避免欺骗和基于会话的攻击,cookie被加密。如果不将Rails secret_key_base暴露给客户端,你就无法解密它 - 这是一个非常糟糕的主意或者放弃对加密cookie的保护。

相反,您可能只想让您的视图/布局告诉您是否有登录用户:

<!DOCTYPE html>
<html>
<head>
  <title>Chess</title>
  <%= stylesheet_link_tag    'application', media: 'all' %>
  <%= javascript_include_tag 'application' %>
  <%= csrf_meta_tags %>
</head>

<%= content_tag(:body, data: { "signed-in" => user_signed_in?.to_s }) do %>
  <%= yield %>
<% end %>
</html>

这将让您阅读$('body').data('signed_in')并避免暴露/复制客户端上的任何实际身份验证逻辑。这也适用于Turbolinks,因为Turbolinks取代了body标签。

你会像这样使用它:

// @return Boolean
function is_user_signed_in(){
  $('body').data('signed-in') === 'true';
}

答案 1 :(得分:0)

您可以将javascript移到资源中。 扩展到最大答案后,它可以查看$(&#39; body&#39;)。data(&#39; signed_in&#39;)的值 例如:

if($('body').data('signed_in') == true){
  //execute
}

因此,您的javascript仍然需要包含在客户端的浏览器中,但使用上述逻辑只允许您在用户登录时运行。