我试图找到一种方法,只有在用户登录时才运行特定的coffeescript代码。有没有办法实现这一点,而不必包含特定的coffeescript文件。例如,检查是否找到了值为user_id
的会话cookie,然后运行这段代码。
目标是删除一些内联JavaScript并将其移至资源。
答案 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仍然需要包含在客户端的浏览器中,但使用上述逻辑只允许您在用户登录时运行。