Бандлер ломает находчивые маршруты?

Бандлер ломает мой находчивый маршрут!

Чтобы подтвердить, я создал чистое приложение для рельсов (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"

маршруты.rb

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

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

person Steven Ou    schedule 15.10.2010    source источник
comment
В своем предыдущем вопросе вы сказали, что используете рельсы 2.3.8, но в этом вопросе вы говорите 2.3.4. В инструкциях сборщика требуется как минимум 2.3.5. Вы можете подтвердить, какую версию рельсов вы используете для этого приложения?   -  person Jaime Bellmyer    schedule 15.10.2010
comment
на самом деле я пробовал 2.3.4, 2.3.5, 2.3.8 все безрезультатно...   -  person Steven Ou    schedule 15.10.2010
comment
Хотя это долго, было бы также полезно увидеть ваши файлы boot.rb, preinitializer.rb, Gemfile и route.rb. Я воссоздал приложение 2.3.4 и следовал инструкциям, на которые вы ссылались, и я не получаю ошибок маршрутизации, которые вы делали. Мне интересно, если где-то опечатка - это куплрит.   -  person Jaime Bellmyer    schedule 15.10.2010
comment
как мне лучше отправить вам файлы? я должен просто скопировать и вставить все??? я буквально копирую блок с сайта и вставляю его в свой boot.rb, хотя... он постоянно ломается. Я думал, что люди смогут воссоздать это...   -  person Steven Ou    schedule 15.10.2010
comment
Если вы хотите, вы можете заархивировать все приложение и отправить его по адресу [email protected]. в противном случае вы можете вставить полное содержимое 4 файлов выше.   -  person Jaime Bellmyer    schedule 15.10.2010
comment
Пожалуйста, не отправляйте его только Хайме, поместите код в вопрос, чтобы другие люди могли его увидеть и предложить ответы. Мне трудно поверить, что Bundler делает это, вместо этого делая ставку на что-то в config/boot.rb.   -  person Ryan Bigg    schedule 15.10.2010
comment
оба отправлены по электронной почте и вставлены сюда ... надеюсь, вы, ребята, поможете мне разгадать эту тайну!   -  person Steven Ou    schedule 15.10.2010
comment
Узнал о некоторых хороших драгоценных камнях в вашем gemfile - приятно знать. Спасибо.   -  person Zabba    schedule 15.10.2010


Ответы (1)


deep_merge — это драгоценный камень, который вызывает проблему. сам бандлер прекрасно работает и без него.

person Jaime Bellmyer    schedule 15.10.2010
comment
deep_merge и deep_merge! хэш-методы уже существуют, и они перезаписаны этим геммом. Это имеет смысл, потому что, когда гем используется, ваши хэши маршрутов переупорядочиваются. rake routes обычно сначала показывает контроллер, затем действие, но deep_merge перевернул это. В любом случае, вы уверены, что вам это нужно? Что-то в маршрутизации использует deep_merge и ожидает версию по умолчанию для рельсов. Драгоценный камень ломает ожидания рельсов. - person Jaime Bellmyer; 15.10.2010
comment
аааа, это все объясняет... честно говоря, я не знал, что в рельсах уже есть функции deep_merge. так что я на самом деле не уверен, что мне нужен драгоценный камень. (хотя я также не могу понять, зачем создавать драгоценный камень, если методы уже существуют...). мне придется попробовать методы deep_merge по умолчанию и посмотреть, работают ли они для того, что мне нужно! большое спасибо! Я не думаю, что когда-либо решил бы это сам :) должен любить ТАК! - person Steven Ou; 15.10.2010