私のレールアプリで私はユーザ認証にdeviseを使用しています。私はまた、ウェブサイト全体にi18nを使用しており、各ユーザーはユーザー設定で自分または特定の言語を選択する可能性があります。ユーザーが指定されたロケールセットを持つWebサイトを参照するか、またはゲストであり、デフォルトのロケールが使用されている場合、そのロケールをURLに表示しないようにします。rspecサポートファイルの拡張クラスで最新のdeviseユーザを取得
ここでは例です:URLが「anything.com/users/42」のようなものであるので、彼女または彼はでない恒久的(フランス語に変更された場合
ゲストは、英語(デフォルト)バージョンを使用していますたとえばフランス語版へのリンクをクリックすると、URLは「anything.com/fr/users/42」に変わります。そのユーザーがログインしていて、既定の言語としてフランス語を選択した場合、それは逆です。
これは、これは私のアプリで完璧に動作し、私のapplication_controller
# app/controllers/application_controller.rb
def default_locale
current_user ? current_user.locale : I18n.default_locale
end
helper_method :default_locale
def default_url_options options={}
(I18n.locale.to_s.eql?(default_locale.to_s) ? { locale: nil } : { locale: I18n.locale }).merge options
end
に以下の行によって実現されます。
しかし、テストするときに問題があります。リダイレクトをチェックするために
visit edit_league_path(@league)
expect(page.current_path).to eq league_path(@league)
:いくつかのテストでは、私はLeague
という名前の既存のモデルのために、このような表現を持っています。リーグのためのアクションedit
は、管理者だけに許可されます。
私が使用しているので、私は次のメソッドを持つ前に、(管理者でない)ユーザーでログインしている工夫:
# spec/support/controller_macros.rb
module ControllerMacros
def login_user *user_roles
before(:each) do
@request.env['devise.mapping'] = Devise.mappings[:user]
user = FactoryGirl.create(:user, *user_roles)
user.confirmed_at = Time.zone.now
user.save
sign_in user
end
end
end
ユーザーのための工場がランダムなロケールを持つランダムなユーザーが作成されます。
Iも(hereを議論したように)application_controller
からdefault_url_options
はRSpecのテストでは無視されているので、RSpecのテストのためのローカライズを修正したサポートファイルを、持っている:
# spec/support/fix_localization.rb
# workaround, to set default locale for ALL spec
class ActionView::TestCase::TestController
def default_url_options options={}
{ locale: I18n.locale }.merge options
end
end
class ActionDispatch::Routing::RouteSet
def default_url_options options={}
{ locale: I18n.locale }.merge options
end
end
今私の問題は、そのデフォルトのi18nロケールセット(たとえばen
)を持つログインユーザーが、リーグの編集ページにアクセスすると、そのページを訪問することが許可されていないため、リダイレクトされます。リダイレクトではdefault_url_options
メソッドがapplication_controller
であるとみなされ、/en/leagues/42
(テストのとおり)にリダイレクトされませんが、/leagues/42
にリダイレクトされます。この問題への
私のソリューションは、application_controller
と同じにspec/support/fix_localization.rb
にdefault_url_options
方法を変更することですが、私はサポートファイルの現在のユーザーにアクセスすることはできません。
現行のユーザーにアクセスする方法や、自分の問題の別のアイデアや回避策を知る方法はありますか?
ありがとうございます!