2013-03-04 58 views
3

好的,所以我知道我正在和這裏的大男孩和女孩玩弄前端和後端MVC(儘管bbone不完全是MVC),但是這個是我有史以來第一個真正強大的應用程序,不幸的是,它在學術領域,支持不在那裏,尤其是更具優勢,所以我很感激。在Rails配置上設計主幹Heroku和require.js

我嘗試使用Rails(3.2.2)應用程序部署到Heroku時出現了一些錯誤,並且資產管道一直在導致問題。由於我在前端使用了BBone,並且[單頁]頁面[app]需要知道載入圖像和聲音的路徑,所以我不得不使用this gist將圖像路徑附加到App.assets以傳遞給application.js require.js文件啓動正在構建在前端的應用程序。

問題似乎是設計想要:config.assets.initialize_on_precompile = false而需要的要求:config.assets.initialize_on_precompile = true和Heroku希望在production.rb文件是:config.assets.compile = true

我得到的錯誤是在呼叫到DB提出把所有的歌曲在Song模型的要點文件assets.js.erb,倒數第二行

App = {}; 
App.assets = { 
    // Returns an object containing all of asset pipeline's image paths. 
    // 
    // Sample: 
    // 
    // { 
    // avatars/missing_avatar.png: "/assets/avatars/missing_avatar.png" 
    // chosen-sprite.png: "/assets/chosen-sprite.png" 
    // circle_green.png: "/assets/circle_green.png" 
    // circle_orange.png: "/assets/circle_orange.png" 
    // circle_red.png: "/assets/circle_red.png" 
    // circle_yellow.png: "/assets/circle_yellow.png" 
    // document.png: "/assets/document.png" 
    // } 
    // 

    // This hash is because Rails' Asset Pipeline bundles the routes to files 
    // per user session, then hands that to the user's session browser, for security. 
    // So we create in Ruby (erb = embedded ruby) a hash of the images to be accessed 
    // in the JS. 
    images: { 
    <% AssetsUtil.images.each do |img| %> 
     "<%= img %>" : "<%= asset_path(img) %>", 
    <% end %> 
    }, 

    // Return a formatted URL for an asset. 
    // 
    // Sample: 
    // 
    // "/assets/document/png." 
    // 
    path: function(name) { 
    // If the file is in our images object, pull the path from there. 
    if (this.images && this.images[name]) { 
     return this.images[name]; 
    } 

    // Otherwise, create a generic asset path. 
    return '/assets/' + name; 
    } 
}; 

// Currently this is ALL the songs in the DB, not just the current_user 's songs 
App.songs = { 
    songs: <%= Song.all.to_json.html_safe %> 
}; 

試圖完整的跟蹤誤差rake assets:precompile作爲部署到Heroku的前建議待辦事項是:

** Invoke assets:precompile (first_time) 
** Invoke requirejs:precompile:external (first_time) 
** Invoke requirejs:test_node (first_time) 
** Execute requirejs:test_node 
** Execute requirejs:precompile:external 
/Users/me/.rvm/rubies/ruby-1.9.3-p362/bin/ruby /Users/me/.rvm/gems/ruby-1.9.3-p362/bin/rake requirejs:precompile:all RAILS_ENV=production RAILS_GROUPS=assets --trace 
** Invoke requirejs:precompile:all (first_time) 
** Invoke requirejs:precompile:prepare_source (first_time) 
** Invoke requirejs:setup (first_time) 
** Invoke assets:environment (first_time) 
** Invoke requirejs:precompile:disable_js_compressor (first_time) 
** Execute requirejs:precompile:disable_js_compressor 
** Execute assets:environment 
** Execute requirejs:setup 
** Invoke requirejs:clean (first_time) 
** Invoke requirejs:setup 
** Execute requirejs:clean 
** Execute requirejs:precompile:prepare_source 
rake aborted! 
uninitialized constant Song 
    (in /Users/me/dev/SoundOfFractions/app/assets/javascripts/assets.js.erb) 
/Users/me/dev/SoundOfFractions/app/assets/javascripts/assets.js.erb:48:in `block in singletonclass' 
/Users/me/dev/SoundOfFractions/app/assets/javascripts/assets.js.erb:65530:in `instance_eval' 
/Users/me/dev/SoundOfFractions/app/assets/javascripts/assets.js.erb:65530:in `singletonclass' 
/Users/me/dev/SoundOfFractions/app/assets/javascripts/assets.js.erb:65528:in `__tilt_70168709646800' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/tilt-1.3.4/lib/tilt/template.rb:144:in `call' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/tilt-1.3.4/lib/tilt/template.rb:144:in `evaluate' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/tilt-1.3.4/lib/tilt/template.rb:77:in `render' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/context.rb:177:in `block in evaluate' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/context.rb:174:in `each' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/context.rb:174:in `evaluate' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/processed_asset.rb:12:in `initialize' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/base.rb:241:in `new' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/base.rb:241:in `block in build_asset' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/base.rb:262:in `circular_call_protection' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/base.rb:240:in `build_asset' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/index.rb:89:in `block in build_asset' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/caching.rb:19:in `cache_asset' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/index.rb:88:in `build_asset' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/base.rb:163:in `find_asset' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/index.rb:56:in `find_asset' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/bundled_asset.rb:16:in `initialize' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/base.rb:244:in `new' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/base.rb:244:in `build_asset' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/index.rb:89:in `block in build_asset' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/caching.rb:19:in `cache_asset' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/index.rb:88:in `build_asset' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/base.rb:163:in `find_asset' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/index.rb:56:in `find_asset' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/requirejs-rails-0.9.1/lib/tasks/requirejs-rails_tasks.rake:94:in `block (4 levels) in <top (required)>' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/base.rb:212:in `block in each_logical_path' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/base.rb:200:in `block (2 levels) in each_file' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/base.rb:190:in `each' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/base.rb:190:in `each_entry' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/base.rb:198:in `block in each_file' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/base.rb:197:in `each' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/base.rb:197:in `each_file' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/sprockets-2.1.3/lib/sprockets/base.rb:210:in `each_logical_path' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/requirejs-rails-0.9.1/lib/tasks/requirejs-rails_tasks.rake:92:in `block (3 levels) in <top (required)>' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:228:in `call' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:228:in `block in execute' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:223:in `each' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:223:in `execute' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:166:in `block in invoke_with_call_chain' 
/Users/me/.rvm/rubies/ruby-1.9.3-p362/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:159:in `invoke_with_call_chain' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:187:in `block in invoke_prerequisites' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:185:in `each' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:185:in `invoke_prerequisites' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:165:in `block in invoke_with_call_chain' 
/Users/me/.rvm/rubies/ruby-1.9.3-p362/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:159:in `invoke_with_call_chain' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:152:in `invoke' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/application.rb:143:in `invoke_task' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/application.rb:101:in `block (2 levels) in top_level' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/application.rb:101:in `each' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/application.rb:101:in `block in top_level' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/application.rb:110:in `run_with_threads' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/application.rb:95:in `top_level' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/application.rb:73:in `block in run' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/application.rb:160:in `standard_exception_handling' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/application.rb:70:in `run' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/bin/rake:33:in `<top (required)>' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/bin/rake:19:in `load' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/bin/rake:19:in `<main>' 
Tasks: TOP => requirejs:precompile:all => requirejs:precompile:prepare_source 
rake aborted! 
Command failed with status (1): [/Users/me/.rvm/rubies/ruby-1.9.3-p362...] 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/file_utils.rb:53:in `block in create_shell_runner' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/file_utils.rb:45:in `call' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/file_utils.rb:45:in `sh' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/file_utils_ext.rb:40:in `sh' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/file_utils.rb:80:in `ruby' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/file_utils_ext.rb:40:in `ruby' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/actionpack-3.2.2/lib/sprockets/assets.rake:12:in `ruby_rake_task' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/requirejs-rails-0.9.1/lib/tasks/requirejs-rails_tasks.rake:85:in `block (3 levels) in <top (required)>' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:228:in `call' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:228:in `block in execute' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:223:in `each' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:223:in `execute' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:166:in `block in invoke_with_call_chain' 
/Users/me/.rvm/rubies/ruby-1.9.3-p362/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:159:in `invoke_with_call_chain' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:187:in `block in invoke_prerequisites' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:185:in `each' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:185:in `invoke_prerequisites' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:165:in `block in invoke_with_call_chain' 
/Users/me/.rvm/rubies/ruby-1.9.3-p362/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:159:in `invoke_with_call_chain' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/task.rb:152:in `invoke' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/application.rb:143:in `invoke_task' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/application.rb:101:in `block (2 levels) in top_level' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/application.rb:101:in `each' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/application.rb:101:in `block in top_level' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/application.rb:110:in `run_with_threads' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/application.rb:95:in `top_level' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/application.rb:73:in `block in run' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/application.rb:160:in `standard_exception_handling' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/lib/rake/application.rb:70:in `run' 
/Users/me/.rvm/gems/[email protected]/gems/rake-10.0.3/bin/rake:33:in `<top (required)>' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/bin/rake:19:in `load' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/bin/rake:19:in `<main>' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/bin/ruby_noexec_wrapper:14:in `eval' 
/Users/me/.rvm/gems/ruby-1.9.3-p362/bin/ruby_noexec_wrapper:14:in `<main>' 
Tasks: TOP => assets:precompile => requirejs:precompile:external 

的Gemfile:

source 'https://rubygems.org' 

gem 'rails', '3.2.2' 

# Bundle edge Rails instead: 
# gem 'rails', :git => 'git://github.com/rails/rails.git' 

group :development, :test do 
    gem 'railroady' 
    gem 'sqlite3' 
    # For linux support 
    gem 'therubyracer' 
end 

group :production do 
    gem 'pg' 
    gem 'thin' 
end 

# Gems used only for assets and not required 
# in production environments by default. 
group :assets do 
    # See https://github.com/sstephenson/execjs#readme for more supported runtimes 
    gem 'uglifier', '>= 1.0.3' 
end 

# gem "better_errors", ">= 0.2.0", :group => :development 
# gem "binding_of_caller", ">= 0.6.8", :group => :development 

gem 'sass-rails', '~> 3.2.3' 
gem 'coffee-rails', '~> 3.2.1' 

gem 'jquery-rails' 
gem 'rails-backbone' 
gem "bootstrap-sass", "~> 2.3.0.0" 
gem 'requirejs-rails' 
gem 'ejs' 
gem 'devise' 


gem "better_errors", ">= 0.2.0", :group => :development 
gem "binding_of_caller", ">= 0.6.8", :group => :development 
gem 'color_routes' 
gem 'gon' 

那麼我應該從哪裏開始配置才能完成部署?

潛在信息: 如果你看如何從Railscasts here定製Rake任務,運行自定義rake任務時,會發生同樣的錯誤,和Ryan解釋說,因爲自定義任務需要一個任務不能訪問數據庫=> :environment dependency(在電影中〜4:15)訪問User類。由於預編譯無法訪問歌曲模型,因此如何提供與application.js file相同或相似的依賴關係?

其它信息:

據我瞭解資產管道工程是每個會話的方式,它捆綁路徑(所以當你輸入像<%= link_to 'Sign in', new_user_path %>,軌道定義在資產管道的路徑,並提供其因爲Backbone是客戶端渲染,它需要知道頁面從rails服務器傳遞後的圖像和聲音的路徑,而我發現的唯一方法是上面列出的要點,它在哪裏將這些「資產」捆綁到JS中,類似於gem 'gon'的方法,它爲頁面提供了全局變量。我當然在用新的理由,並願意重組,但它在dev模式下工作,所以我試圖弄清楚production也是如此。

+0

抱歉,這不完全是一個答案,但你可以指出你爲什麼要使用JavaScript資產幫手?有沒有關於它的詳細信息的博客/文章?這個東西對我來說是全新的。 – neebz 2013-03-04 10:16:07

+0

@nEEbz評論被認爲太長,所以我把它放在上面的'OTHER info:'部分 – 2013-03-04 14:59:10

回答

1

在heroku資源預編譯期間,您不能使用Rails環境。由於它們是一次製作而沒有再次刷新,因此可以告訴下一次部署。話雖如此。您應該將動態數據庫相關調用移動到您的視圖中,並通過API調用或通過在json中將腳本標記寫入dom中的JavaScript來「引導」數據來呈現數據。我通常有window.NAME_OF_APPLICATION.collections.SONGS,所以它們可以在全局範圍內使用。

例子。

:javascript 
    window.lineItems = {lineItems: #{ @order.line_items.order("position").to_json(:include => :department).html_safe}, order: #{@order.to_json} } 

當骨幹上線時,它會要求這些項目。併爲他們初始化一個集合。