1

私はすでにこのトピックについていくつかの調査を行ってきましたが、私はそれを理解することができないようです.

公式ガイドに従ってI18n をセットアップしましたが、デフォルトのロケールが適切に設定されていません (明示的なロケールが指定されていない場合)。

# routes.rb
require 'sidekiq/web'

Iq::Application.routes.draw do
  scope "(:locale)", locale: /de|en/ do
    # ...
  end
end

# application_controller.rb
class ApplicationController < ActionController::Base
  before_filter :set_language

  def set_language
    I18n.locale = params[:locale] || I18n.default_locale
  end

  def default_url_options(options = {})
    options.merge!({ :locale => I18n.locale })
  end
end

OS X コンソールで:

$ rake routes | grep user
...
user GET      (/:locale)/users/:id(.:format)   users#show {:locale=>/de|en/}
...

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'

なぜこれが機能しないのですか?私は何を忘れましたか?

助けてくれてありがとう、ジョシュ

4

1 に答える 1

1

同僚の A がそれを調べて、(:locale)括弧に入れてはいけないと判断しました。別の同僚 B は、URL ヘルパー メソッドを呼び出すときにロケールを明示的に指定したくないテストが機能するように、それを括弧に入れたと述べました。

同僚 A はdefault_url_options、URL ヘルパー メソッドがロケールなしで呼び出されると、アプリケーション自体が上記のメソッドにフォールバックすると述べました。root_pathを除いて、常に明示的な言語セットが必要なため、これは素晴らしいことです。

ただし、テストでは、default_url_optionsメソッドは無視されます (これがバグなのか機能なのかはわかりませんが、笑)。したがって、いくつかの回避策を講じる必要があります。

# 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 ファイルに追加すると、コントローラーを使用して仕様を要求する準備が整います! :-)

それでも、コンソールでは、これはうまくいかないようです:

$ app.user_path User.first
ActionController::RoutingError: No route matches...
于 2012-11-12T14:50:46.687 に答える