从其他应用访问javascript文件

时间:2015-08-17 10:47:17

标签: javascript ruby-on-rails apache assets precompile

我试图从另一个访问我的应用程序的预编译文件。我是一个特定的架构。这是一个简化的树

├── app
│   ├── assets
│   │   ├── javascripts
│   │   │   ├── application.coffee
│   │   │   ├── my_js_file.coffee
├── my-other-app
│   ├── index.html
│   ├── javascript
│   │   ├── anotherJSFile.js

我想加载index.html my_js_file.coffee的编译文件。

my-other-app不是Rails应用。它包含一个基本的index.html文件,其中特定的URL重定向,我尝试这样的地方:

<script src="http://myapp.com/assets/my_js_file.js"></script>

我已经在Apache配置文件中定义了它(这部分没问题)。

我的问题是我无法找到任何方法来访问已编译的my_js_file.js文件。访问文件和文件名本身(带指纹)。我该怎么解决这个问题?

修改 我认为主要问题来自指纹,因为我需要了解它以动态调整我的第二个应用的网址。

EDIT2: 我找到了一种方法来生成具有正确指纹的动态网址,但我仍然无法访问已编译的文件(未经授权)

1 个答案:

答案 0 :(得分:0)

我做到了,但有点棘手。

有两点:

  1. js fingerprint
  2. 从rails应用程序到另一个网页(在此rails应用程序环境之外)的身份验证令牌
  3. 要解决第一点,我必须在模型上创建一个方法,我在部署结束时调用(capistrano}来动态修改我的index.html文件。我是这样做的:

    #my-other-app/index.html
    
    <!doctype html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    
            <!-- BEGIN DYNAMIC URI -->
    
            <!-- END DYNAMIC URI -->
    
        </head>
        <body >
            <div id="awesome">
                Some stuff here..
            </div>
        </body>
    </html>
    
    #myModel.rb
    def self.generate_index_file
      js_files = ['my_js_file.js']
      tempfile = File.open Rails.root.join('my-other-app/index.tmp'), 'w'
      f = File.new('my-other-app/index.html')
      f.each do |line|
        if line =~ /^.*<!-- BEGIN DYNAMIC URI -->/
          tempfile << line
          js_files.each do |filename|
            fingerprinted_name = Rails.application.assets.find_asset(filename).digest_path
            tempfile << "<script src='#{Rails.application.default_url_options[:host]}/assets/" + fingerprinted_name + "?body=1'></script>\n"
          end
    
        else
          tempfile << line
        end
      end
    
      f.close       
      tempfile.close
    
      FileUtils.mv("my-other-app/index.tmp", "my-other-app/index.html")
    end
    
    #config/deploy/production.rb
    # Available only for Capistrano 2.x
    
    namespace :deploy do
      task :generate_samsung_index, roles: :app do
        run %Q{cd #{latest_release} && RAILS_ENV=#{rails_env} bundle exec rails runner 'MyModel.generate_index_file'}
      end 
    end
    after "deploy:restart", "deploy:generate_samsung_index"
    

    现在,为了解决问题的第二部分(验证部分),我需要在将URL添加到<head>之前将其添加到URL。这是我的代码:

    #my_models_controller.rb
    def my_method
      redirect_to "http://myawesomeurl.com?token=#{form_authenticity_token}"
    end
    
    #my-other-app/index.html
    # On <head> with my previous code
    <script language="javaScript" type="text/javascript">
       meta1 = document.createElement("meta");
       meta1.name = "csrf-param";
       meta1.content = "authenticity_token";
       $("head").append(meta1);
    
       token = "token"
       token_result = new RegExp(token + '=([^&]*)', 'i').exec(window.location.search)
       meta2 = document.createElement("meta");
       meta2.name = "csrf-param";
       meta2.content = token_result;
    
       $("head").append(meta1);
       $("head").append(meta2);
     </script>
    

    我希望这会帮助别人。