Rails 4.2 - помощник по URL вызывает ArgumentError: неправильное количество аргументов (3 для 1..2)

Мы обновляем наше приложение Rails с 4.1 до 4.2.

Хотя этот код отлично работает в 4.0 и 4.1:

admin_root_url(:subdomain => 'www')

Когда я пробую это на 4.2.3, я получаю эту ошибку:

ArgumentError: wrong number of arguments (3 for 1..2)

Я проверил это несколько раз в консоли, запустив этот код:

include Rails.application.routes.url_helpers
default_url_options[:host] = "localhost"
root_url

Наш Gemfile выглядит так:

source 'https://rubygems.org'
ruby "2.1.2"

gem 'rails', '4.2.4'
gem 'rake', "~> 10.2.2"

group :development do
    # Use sqlite3 as the database for Active Record
    gem 'sqlite3'

    # Generates model and controller UML diagrams
  gem 'railroady'
  gem 'bullet'
  gem 'web-console', '~> 2.0'
end

group :staging, :production do
  gem 'pg'
  gem 'rails_12factor'
  gem 'newrelic_rpm'
end

gem 'sass-rails', '~> 4.0.0'
gem 'less-rails-bootstrap'
gem 'uglifier', '>= 1.3.0'
gem 'yui-compressor'
gem 'coffee-rails', '~> 4.0.0'
gem 'therubyracer', platforms: :ruby
gem 'jquery-rails'
gem 'jquery-ui-rails'
gem 'jbuilder', '~> 1.2'

group :doc do
  # bundle exec rake doc:rails generates the API under doc/api.
  gem 'sdoc', require: false
end

gem 'simple_form', '~> 3.1.0'
gem "paperclip", "~> 4.2"
gem 'aws-sdk'
gem 'devise', '~> 3.5.2'
gem "cancan"
gem 'friendly_id', '~> 5.0.2'
gem 'pusher', '~> 0.14.5'
gem "configurable_engine", :path => "vendor/gems/configurable_engine"
gem 'backbone-rails'
gem 'marionette-rails'
gem "breadcrumbs_on_rails"
gem 'subdomain-fu', :git => "git://github.com/mbleigh/subdomain-fu.git"
gem 'bitly'
gem 'social-share-button', '~> 0.1.8'
gem 'momentjs-rails', '~> 2.5.0'
gem 'bootstrap3-datetimepicker-rails', '~> 3.0.0'
gem 'rails_autolink'
gem 'jquery-datatables-rails', github: 'rweng/jquery-datatables-rails'
gem "twitter"
gem 'unicorn'
gem 'i18n-js', '>= 3.0.0.rc11'
gem 'sitemap_generator'
gem 'will_paginate-bootstrap'

group :test, :development, :staging do
  gem 'populator'
  gem 'faker'
end

gem "jquery-fileupload-rails"
gem 'rails-timeago', '~> 2.0'
gem 'font-awesome-rails'
gem 'omniauth'
gem 'omniauth-twitter'
gem 'omniauth-facebook'
gem 'jquery-minicolors-rails'
gem 'htmlentities', '~> 4.3.2'
gem 'sanitize'
gem 'nokogiri'
gem 'dalli'
gem 'kgio', '~> 2.9.3'
gem 'useragent'
gem "fog", "~>1.20"#, require: "fog/aws/storage"
gem 'asset_sync'
gem 'responders', '~> 2.0'
gem 'rails-deprecated_sanitizer'

================ edit ===============
Трассировка стека в консоли:

ArgumentError: wrong number of arguments (3 for 1..2)
    from /home/guy/.rvm/gems/ruby-2.1.2/bundler/gems/subdomain-fu-3752799a02c0/lib/subdomain_fu/url_rewriter.rb:6:in `url_for_with_subdomains'
    from /home/guy/.rvm/gems/ruby-2.1.2/gems/actionpack-4.2.4/lib/action_dispatch/routing/route_set.rb:282:in `call'
    from /home/guy/.rvm/gems/ruby-2.1.2/gems/actionpack-4.2.4/lib/action_dispatch/routing/route_set.rb:225:in `call'
    from /home/guy/.rvm/gems/ruby-2.1.2/gems/actionpack-4.2.4/lib/action_dispatch/routing/route_set.rb:347:in `block (2 levels) in define_url_helper'
    from (irb):3
    from /home/guy/.rvm/gems/ruby-2.1.2/gems/railties-4.2.4/lib/rails/commands/console.rb:110:in `start'
    from /home/guy/.rvm/gems/ruby-2.1.2/gems/railties-4.2.4/lib/rails/commands/console.rb:9:in `start'
    from /home/guy/.rvm/gems/ruby-2.1.2/gems/railties-4.2.4/lib/rails/commands/commands_tasks.rb:68:in `console'
    from /home/guy/.rvm/gems/ruby-2.1.2/gems/railties-4.2.4/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
    from /home/guy/.rvm/gems/ruby-2.1.2/gems/railties-4.2.4/lib/rails/commands.rb:17:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'

================ edit (2) ===============
Я погрузился в код и увидел, что строка в / gems/actionpack-4.2.4/lib/action_dispatch/routing/route_set.rb (282), который вызывает ошибку, заключается в следующем:

t._routes.url_for(hash, route_name, url_strategy)

В то время как сигнатура функции url_for в url_rewriter выглядит так:

def url_for_with_subdomains(options, path_segments=nil)

Похоже, мне нужно что-то обновить, но я не знаю, что.

================ edit (3) ================
Просто чтобы убедиться, что это не имеет ничего общего с моим routes.rb, я его почистил и оставил так:

MyApp::Application.routes.draw do
  root 'pages#index', :constraints => {:subdomain => /www|$^/}
end

Как и ожидалось, все еще есть та же ошибка.


person guyaloni    schedule 26.08.2015    source источник
comment
Добавьте сгенерированную трассировку стека   -  person coorasse    schedule 26.08.2015
comment
Вы пытались использовать обновленный синтаксис хэша. admin_root_url(subdomain: 'www')? Однако для меня было бы новым, что поддержка «старого» синтаксиса была полностью прекращена.   -  person The F    schedule 26.08.2015
comment
Да, я пробовал. Как я уже упоминал, он вызывает ту же ошибку, даже если URL-адрес не имеет аргументов, как root_url.   -  person guyaloni    schedule 26.08.2015
comment
можешь опубликовать свой routes.rb   -  person bigsolom    schedule 27.08.2015
comment
Просто сделал. Это не имеет к этому никакого отношения, см. мой комментарий edit(2).   -  person guyaloni    schedule 27.08.2015
comment
Вы это исправили? Я столкнулся с той же проблемой. Мне пришлось изменить все мои пути вручную. :/   -  person Karthik Kamalakannan    schedule 13.05.2016
comment
Нет, на данный момент мы оставили его и оставили более низкую версию.   -  person guyaloni    schedule 13.05.2016


Ответы (4)


Была та же проблема, решение было вместо использования:

include Rails.application.routes.url_helpers

Я не включал и не добавлял url_helpers в переменную, например:

url_helpers = Rails.application.routes.url_helpers
url_helpers.root_url
person Juliano    schedule 16.10.2015

У меня была точно такая же проблема, и в конце в моем случае

t._routes.url_for(hash, route_name, url_strategy)

называется url_for_with_secure_option из bartt-ssl_requirement драгоценного камня.

Поскольку нам больше не нужен bartt-ssl_requirement драгоценный камень, в нашем случае решением было просто удалить bartt-ssl_requirement драгоценный камень.

person Sinisa Grgic    schedule 10.05.2017

Попробуйте удалить subdomain-fu и использовать Rails4 request.subdomain при необходимости.

person Pablo    schedule 26.06.2017

В случае, если вы получите эту ошибку в консоли, потому что вы используете помощник, который использует помощники URL:

class << helper; include Rails.application.routes.url_helpers; end
helper.my_method # \o/
person codeholic    schedule 20.12.2018