Rails -将视图的javascript代码移动到javascript文件中

Rails - Move view's javascript code to javascript files

本文关键字:javascript 代码移动 文件 视图 Rails      更新时间:2023-09-26

首先让我告诉你,我已经搜索了这个问题,并没有设法找到任何答案。

我有很多Javascript在我的布局/应用程序。html。haml文件:

### at the end of application.html.haml file
- if @instance_variable.condition
    :javascript
        // a lot js/jQuery code
    :javascript
        // more js code that uses #{ @instance.vars }
    - if @another_condition.using.ruby.cody
        :javascript
            // more js code that uses #{ @instance.vars }

我在这段代码中使用实例变量,这意味着这些变量只会在控制器(应用程序控制器)上声明。由于这是应用程序的布局,这些脚本在我网站的每个页面上运行(这当然是我需要的)。

我想要的是移动所有这些代码到一个js。动词文件(如果可能,或.haml)。首先,因为在单独的文件中管理这些代码更容易;第二,因为我不想在每个html文件的末尾都有<script> // a lot of js code </script>标签,所以我只想有一个<script async src='link'/>标签。

我也包括已经在文件开始的application.coffee,但我需要这个脚本标签在html文件的末尾。

我不建议使用偏号。因为,你的代码使用变量,这意味着它的变化取决于你的变量。如果你把它们放到一个单独的javascript文件中,浏览器将不知道这些变化,并使用缓存文件。一种解决方法是在文件名的末尾添加一些字符串(当vars更改时更改),但是这样一来,您将失去将javascript移动到单独文件中的所有好处。

一个更好的方法是在你的application.html.haml中定义变量,将你的javascript代码移出到单独的文件中,只使用定义的变量。

application.html.haml

- if @instance_variable.condition
    %script(src="path/to/my/script.js")
    :javascript
        = var some_var = #{@instance.vars}
    %script(src="path/to/my/second_script_that_uses_var.js")

乌兹别克,谢谢你的回答,但经过一番研究,我找到了一种方法来做我想要的:)

在我的'layouts/application.html。我添加了一个脚本标签:

### at the end of application.html.haml file
%script{async: 'async', src: application_scripts_path}

然后我将这个路径添加到routes:

get 'application_scripts' => 'controller#application_scripts', as: :application_scripts

然后我只需要在控制器上设置这个动作application_scripts并创建一个新视图(app/views/controller/application_scripts .js.erb):

class Controller < ActionController::Base
    # 1
    protect_from_forgery except: :application_scripts
    def application_scripts
        # 2
        if condition.that.tells.me.this.request.is.valid
            # 3
            render formats: [:js] and return
        end
        render plain: ''
    end

这些步骤当然是比较难找到的:

  • 1 -我必须禁用此保护,否则我会得到这个错误:

    ActionController::InvalidCrossOriginRequest at/application_scripts

    安全警告:另一个站点的嵌入标签请求受保护的JavaScript。如果你知道自己在做什么,请禁用此操作的伪造保护,以允许跨域JavaScript嵌入。

  • 2 -为了确保没有其他网站可以请求这个脚本文件(不是说它对我来说可能是一个问题,但我更喜欢这种方式),我添加了一个条件,确保请求来自我的网站。在这种情况下,我只是检查用户是否已登录。
  • 3 - formats: [:js]告诉Rails视图不是。html,而是一个。js文件'application_scripts.js.erb'

最后,我只需要将所有代码从application.html.haml文件移到视图文件'application_scripts.js中。Erb '和从haml代码转换为Erb。

<% @instance_variable.condition %>
    // a lot js/jQuery code
    // more js code that uses <%= @instance.vars %>
    <% @another_condition.using.ruby.cody %>
        // more js code that uses <%= @instance.vars %>
    <% end %>
<% end %>