Ruby on rails 路线:can';如果无法获取默认范围(:locale)来处理用户路径(id),则必须始终显式提交locale

Ruby on rails 路线:can';如果无法获取默认范围(:locale)来处理用户路径(id),则必须始终显式提交locale,ruby-on-rails,internationalization,locale,Ruby On Rails,Internationalization,Locale,我已经在这个问题上做了一些研究,但我似乎还没有弄明白 我已经按照设置I18n的方法进行了设置,但是我没有正确设置默认的区域设置(当没有指定显式的区域设置时) 在Rails控制台中: $ Rails c $ app.users_path => "/users" app.users_path locale: :de => "/de/users" $ app.user_path User.first, locale: :de => "/de/users/509fc01d77bb1e6

我已经在这个问题上做了一些研究,但我似乎还没有弄明白

我已经按照设置I18n的方法进行了设置,但是我没有正确设置默认的区域设置(当没有指定显式的区域设置时)

在Rails控制台中:

$ Rails c
$ app.users_path
=> "/users"
app.users_path locale: :de
=> "/de/users"
$ app.user_path User.first, locale: :de
=> "/de/users/509fc01d77bb1e6a050000a0"
$ app.user_path User.first
ActionController::RoutingError: No route matches {:action=>"show", :controller=>"users", :locale=>#<User _id: 509fc01d77bb1e6a050000a0, _type: nil, created_at: 2012-11-11 15:11:25 UTC, updated_at: 2012-11-11 15:11:25 UTC, deleted_at: nil, group: "administrator", language: "de", active: true, sign_in_count: 0, name: "sysadmin", email: "support@sientia.ch", encrypted_password: "$2a$10$n/b7sTmUjEMoZI/jvq2jPuaNQqo1R1zbAIPpko9HT9PERagXclrPK", reset_password_token: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, confirmation_token: nil, unconfirmed_email: nil, reset_password_sent_at: nil, remember_created_at: nil, confirmed_at: 2012-11-11 15:11:25 UTC, confirmation_sent_at: nil, current_sign_in_at: nil, last_sign_in_at: nil, save_vertical_menu_visibility_state: nil, contact_id: "509fc01d77bb1e6a0500008c", contact_name: "Sientia AG">}
from /Users/josh/.rvm/gems/ruby-1.9.3-p0/gems/actionpack-3.2.8/lib/action_dispatch/routing/route_set.rb:532:in `raise_routing_error'
$Rails c
$app.users\u路径
=>“/用户”
app.users\u路径区域设置::de
=>“/de/users”
$app.user\u路径user.first,区域设置::de
=>“/de/users/509FC01D77BB1E6A05000A0”
$app.user\u路径user.first
ActionController::RoutingError:没有路由匹配{:action=>“show”,:controller=>“users”,:locale=>#}
来自/Users/josh/.rvm/gems/ruby-1.9.3-p0/gems/actionpack-3.2.8/lib/action\u dispatch/routing/route\u set.rb:532:in'raise\u routing\u error'
为什么这样不行?我忘了什么

非常感谢你的帮助,
Josh

一个同事A查看了一下,决定我不应该把
(:locale)
放在括号里。另一位同事B提到,他将其放在括号中,这样我们的测试就可以工作了,在调用url助手方法时,我们不希望显式地指定区域设置

同事A提到,当在没有区域设置的情况下调用url助手方法时,应用程序本身会返回到上面提到的
default\u url\u options
方法。这很好,因为除了
根路径
,我们总是需要一个显式的语言集

但是在测试中,
default\u url\u options
方法被忽略(我不确定这是一个bug还是一个特性,哈哈)。因此,我们必须采取一些变通办法:

# Fixes the missing default locale problem in request specs.
# See http://www.ruby-forum.com/topic/3448797
class ActionView::TestCase::TestController
  def default_url_options(options={})
    { :locale => I18n.default_locale }
  end
end

class ActionDispatch::Routing::RouteSet
  def default_url_options(options={})
    { :locale => I18n.default_locale }
  end
end

# Fixes the missing default locale problem in controller specs
# See http://www.ruby-forum.com/topic/3448797#1041659
class ActionController::TestCase
  module Behavior
    def process_with_default_locale(action, parameters = nil, session = nil, flash = nil, http_method = 'GET')
      parameters = { :locale => I18n.default_locale }.merge( parameters || {} )
      process_without_default_locale(action, parameters, session, flash, http_method)
    end
    alias_method_chain :process, :default_locale
  end
end

module ActionDispatch::Assertions::RoutingAssertions
  def assert_recognizes_with_default_locale(expected_options, path, extras = {}, message=nil)
    expected_options = { :locale => I18n.default_locale.to_s }.merge(expected_options || {} )
    assert_recognizes_without_default_locale(expected_options, path, extras, message)
  end
  alias_method_chain :assert_recognizes, :default_locale
end
将其放入spec_helper.rb文件中,您就可以使用控制器并请求spec了!:-)

不过,在控制台中,这似乎并不起作用:

$ app.user_path User.first
ActionController::RoutingError: No route matches...

一位同事A查看了一下,决定我不应该把
(:locale)
放在括号里。另一位同事B提到,他将其放在括号中,这样我们的测试就可以工作了,在调用url助手方法时,我们不希望显式地指定区域设置

同事A提到,当在没有区域设置的情况下调用url助手方法时,应用程序本身会返回到上面提到的
default\u url\u options
方法。这很好,因为除了
根路径
,我们总是需要一个显式的语言集

但是在测试中,
default\u url\u options
方法被忽略(我不确定这是一个bug还是一个特性,哈哈)。因此,我们必须采取一些变通办法:

# Fixes the missing default locale problem in request specs.
# See http://www.ruby-forum.com/topic/3448797
class ActionView::TestCase::TestController
  def default_url_options(options={})
    { :locale => I18n.default_locale }
  end
end

class ActionDispatch::Routing::RouteSet
  def default_url_options(options={})
    { :locale => I18n.default_locale }
  end
end

# Fixes the missing default locale problem in controller specs
# See http://www.ruby-forum.com/topic/3448797#1041659
class ActionController::TestCase
  module Behavior
    def process_with_default_locale(action, parameters = nil, session = nil, flash = nil, http_method = 'GET')
      parameters = { :locale => I18n.default_locale }.merge( parameters || {} )
      process_without_default_locale(action, parameters, session, flash, http_method)
    end
    alias_method_chain :process, :default_locale
  end
end

module ActionDispatch::Assertions::RoutingAssertions
  def assert_recognizes_with_default_locale(expected_options, path, extras = {}, message=nil)
    expected_options = { :locale => I18n.default_locale.to_s }.merge(expected_options || {} )
    assert_recognizes_without_default_locale(expected_options, path, extras, message)
  end
  alias_method_chain :assert_recognizes, :default_locale
end
将其放入spec_helper.rb文件中,您就可以使用控制器并请求spec了!:-)

不过,在控制台中,这似乎并不起作用:

$ app.user_path User.first
ActionController::RoutingError: No route matches...

您不能将其作为默认值传递:
scope“(:locale)”,locale:/de | en/,默认值:{locale:'en'}do
Nice,这就成功了。。。!想创造一个真实的答案吗?然后我把它标记为正确的。非常感谢。但是等等,我需要什么
default\u url\u options
方法呢?这不是完全一样吗?嗯。。。是的,看起来很奇怪
default\u url\u options
没有发挥作用我建议的结果在区域设置中总是出现在url中,这可能不是您所期望的。如果您执行
app.user\u路径id:user.first.id
您不能将其作为默认值传递:
scope“(:locale)”,locale:/de | en/,默认值:{locale:'en'}执行
很好,这就完成了。。。!想创造一个真实的答案吗?然后我把它标记为正确的。非常感谢。但是等等,我需要什么
default\u url\u options
方法呢?这不是完全一样吗?嗯。。。是的,看起来很奇怪
default\u url\u options
没有发挥作用我建议的结果在区域设置中总是出现在url中,这可能不是您所期望的。如果您执行
app.user\u路径id:user.first.id
我在这里偶然发现了自己的解决方案,这是我第一次体验它1.5年后的事!还有更好的解决方案吗?在我第一次体验它1.5年后,我在这里偶然发现了自己的解决方案!还有更好的解决办法吗?