2010-10-15 92 views
1

Bundler正在打破我的机智之路!Bundler破坏足智多谋的路线?

为了确认我创建了一个干净的rails应用程序(2.3.4)并制作了一个users脚手架。

map.resources :users创建如下:

users GET /users(.:format)     {:controller=>"users", :action=>"index"} 
      POST /users(.:format)     {:controller=>"users", :action=>"create"} 
new_user GET /users/new(.:format)    {:controller=>"users", :action=>"new"} 
edit_user GET /users/:id/edit(.:format)   {:controller=>"users", :action=>"edit"} 
    user GET /users/:id(.:format)    {:controller=>"users", :action=>"show"} 
      PUT /users/:id(.:format)    {:controller=>"users", :action=>"update"} 
      DELETE /users/:id(.:format)    {:controller=>"users", :action=>"destroy"} 

现在我按照说明在http://gembundler.com/rails23.html和所有的突然我的路线爆发:

users GET /users(.:format)     {:action=>"index", :controller=>"users"} 
      GET /users(.:format)     {:action=>"index", :controller=>"users"} 
new_user GET /users/new(.:format)    {:action=>"index", :controller=>"users"} 
edit_user GET /users/:id/edit(.:format)   {:action=>"index", :controller=>"users"} 
    user GET /users/:id(.:format)    {:action=>"index", :controller=>"users"} 
      GET /users/:id(.:format)    {:action=>"index", :controller=>"users"} 
      GET /users/:id(.:format)    {:action=>"index", :controller=>"users"} 

插入和从config/boot.rb休息和修复删除代码块,分别是我的路线!有人有主意吗??

这会是很长......的boot.rb:

# Don't change this file! 
# Configure your app in config/environment.rb and config/environments/*.rb 

RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT) 

module Rails 
    class << self 
    def boot! 
     unless booted? 
     preinitialize 
     pick_boot.run 
     end 
    end 

    def booted? 
     defined? Rails::Initializer 
    end 

    def pick_boot 
     (vendor_rails? ? VendorBoot : GemBoot).new 
    end 

    def vendor_rails? 
     File.exist?("#{RAILS_ROOT}/vendor/rails") 
    end 

    def preinitialize 
     load(preinitializer_path) if File.exist?(preinitializer_path) 
    end 

    def preinitializer_path 
     "#{RAILS_ROOT}/config/preinitializer.rb" 
    end 
    end 

    class Boot 
    def run 
     load_initializer 
     Rails::Initializer.run(:set_load_path) 
    end 
    end 

    class VendorBoot < Boot 
    def load_initializer 
     require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer" 
     Rails::Initializer.run(:install_gem_spec_stubs) 
     Rails::GemDependency.add_frozen_gem_path 
    end 
    end 

    class GemBoot < Boot 
    def load_initializer 
     self.class.load_rubygems 
     load_rails_gem 
     require 'initializer' 
    end 

    def load_rails_gem 
     if version = self.class.gem_version 
     gem 'rails', version 
     else 
     gem 'rails' 
     end 
    rescue Gem::LoadError => load_error 
     $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.) 
     exit 1 
    end 

    class << self 
     def rubygems_version 
     Gem::RubyGemsVersion rescue nil 
     end 

     def gem_version 
     if defined? RAILS_GEM_VERSION 
      RAILS_GEM_VERSION 
     elsif ENV.include?('RAILS_GEM_VERSION') 
      ENV['RAILS_GEM_VERSION'] 
     else 
      parse_gem_version(read_environment_rb) 
     end 
     end 

     def load_rubygems 
     min_version = '1.3.2' 
     require 'rubygems' 
     unless rubygems_version >= min_version 
      $stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.) 
      exit 1 
     end 

     rescue LoadError 
     $stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org) 
     exit 1 
     end 

     def parse_gem_version(text) 
     $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/ 
     end 

     private 
     def read_environment_rb 
      File.read("#{RAILS_ROOT}/config/environment.rb") 
     end 
    end 
    end 
end 

class Rails::Boot 
    def run 
    load_initializer 

    Rails::Initializer.class_eval do 
     def load_gems 
     @bundler_loaded ||= Bundler.require :default, Rails.env 
     end 
    end 

    Rails::Initializer.run(:set_load_path) 
    end 
end 

# All that for this: 
Rails.boot! 

preinitializer.rb

begin 
    require "rubygems" 
    require "bundler" 
rescue LoadError 
    raise "Could not load the bundler gem. Install it with `gem install bundler`." 
end 

if Gem::Version.new(Bundler::VERSION) <= Gem::Version.new("0.9.24") 
    raise RuntimeError, "Your bundler version is too old for Rails 2.3." + 
    "Run `gem install bundler` to upgrade." 
end 

begin 
    # Set up load paths for all bundled gems 
    ENV["BUNDLE_GEMFILE"] = File.expand_path("../../Gemfile", __FILE__) 
    Bundler.setup 
rescue Bundler::GemNotFound 
    raise RuntimeError, "Bundler couldn't find some gems." + 
    "Did you run `bundle install`?" 
end 

的Gemfile

source "http://rubygems.org" 
source "http://gemcutter.org" 

gem "rails", "2.3.4" 
gem "newrelic_rpm" 
gem "authlogic" 
gem "geokit" 
gem "will_paginate" 
gem "paperclip" 
gem "delayed_job" 
gem "delayed_paperclip" 
gem "activemerchant", :require => "active_merchant" 
gem "aws-s3", :require => "aws/s3" 
gem "acts_as_archive" 
gem "carmen" 
gem "super_exception_notifier", :require => "exception_notification" 
gem "bitly" 
gem "thinking-sphinx", :require => "thinking_sphinx" 
gem "ts-delayed-delta", :require => "thinking_sphinx/deltas/delayed_delta" 
gem "deep_merge" 
gem "acts_as_taggable_on_steroids" 
gem "whenever" 
gem "ar-extensions" 
gem "fastercsv" 

的routes.rb

ActionController::Routing::Routes.draw do |map| 
    map.resources :users 

    map.connect ':controller/:action/:id' 
    map.connect ':controller/:action/:id.:format' 
end 
+0

在你之前的问题中,你说过你使用rails 2.3.8,但在这个问题中你说2.3.4。在捆绑器说明中,它至少需要2.3.5。你能确认你使用这个应用程序的钢轨版本吗? – 2010-10-15 05:56:47

+0

其实我已经试过2.3.4,2.3.5,2.3.8都无济于事...... – 2010-10-15 06:02:12

+0

虽然它很长,但它也有助于查看你的boot.rb,preinitializer.rb,Gemfile和routes.rb文件。我重新创建了一个2.3.4应用程序,并按照您所链接的说明操作,并且我没有收到您所做的路由错误。我想知道是否某个地方有错字是cuplrit。 – 2010-10-15 06:02:39

回答

1

deep_merge是造成问题的宝石。捆绑器本身没有它就能正常工作。

+0

哇!你是对的!!!嗯mmmm ....任何想法,为什么这将是?? – 2010-10-15 06:55:33

+0

deep_merge和deep_merge!哈希方法已经存在,并且它们被这个gem覆盖。这是有道理的,因为当使用gem时,你的路由哈希被重新排序。 'rake routes'通常首先显示控制器,然后是动作,但是deep_merge将其翻转。无论如何,你确定你需要它吗?路由中的某些东西正在使用deep_merge,并期待rails的默认版本。宝石破坏了铁轨的期望。 – 2010-10-15 07:01:55

+0

ahhhhh解释了这一切......说实话,我并不知道rails已经有了deep_merge函数。所以我其实不确定我需要宝石。 (尽管如果方法已经存在,我也想不出为什么会创建宝石...)。我将不得不尝试默认的deep_merge方法,看看它们是否适合我需要的东西!非常感谢!我不认为我会永远不会解决这个问题:)得爱所以! – 2010-10-15 07:07:31