前提
Railsアプリを作っており、現在は国際化を進めています。
しかし、i18nを導入したところ、ルートが変わってしまったせいか、
今までパスしていたはずのpathに関するテストがエラーになってしまいました。
以下はpathに関するエラーのうちの1つです。
アプリの機能自体は問題がなさそうなので、テストの書き方が悪いのではないかと思うのですが、
対応方法をご教授いただけると嬉しいです。
実現したいこと
- 国際化を導入した状態で、エラーを解決したい
エラーメッセージ
ERROR["test_should_redirect_edit_when_not_logged_in", UsersControllerTest, 3.4624758772552013] test_should_redirect_edit_when_not_logged_in#UsersControllerTest (3.46s) ActionController::UrlGenerationError: ActionController::UrlGenerationError: No route matches {:action=>"edit", :controller=>"users", :locale=>#<User id: 762146111, name: "Michael Example", email: "michael@example.com", created_at: "2022-11-09 09:53:30", updated_at: "2022-11-09 09:53:30", password_digest: "$2a$04$r.WTFttwDcJsuUdBSHQDi.IvFzECkpL37SEdlAKzpdX...", remember_digest: nil, admin: true, activation_digest: nil, activated: true, activated_at: "2022-11-09 09:53:30", reset_digest: nil, reset_sent_at: nil>}, missing required keys: [:id], possible unmatched constraints: [:locale] test/controllers/users_controller_test.rb:21:in `block in <class:UsersControllerTest>'
関係していると思われるソースコード
1. routes.rb
2. application.rb
3. application_controller.rb
4. users_controller_test.rb
〜〜〜〜
- routes.rb
Rails.application.routes.draw do scope "(:locale)", locale: /en | ja/ do root 'static_pages#home' get '/:locale' => 'static_pages#home' get '/help', to: 'static_pages#help' get '/about', to: 'static_pages#about' get '/contact', to: 'static_pages#contact' get '/search', to: 'movies#search' get '/show', to: 'movies#show' get '/signup', to: 'users#new' post '/signup', to: 'users#create' post '/guest_login', to: 'guest_sessions#create' get '/login', to: 'sessions#new' post '/login', to: 'sessions#create' delete '/logout', to: 'sessions#destroy' resources :users do member do get :following, :followers end end resources :movies resources :account_activations, only: [:edit] resources :resend_activations, only: [:new, :create] resources :password_resets, only: [:new, :create, :edit, :update] resources :comments do resource :comments, only: [:create, :new, :edit, :update, :destroy] resource :favorites, only: [:create, :destroy] end resources :relationships, only: [:create, :destroy] end end
2. application.rb
require_relative 'boot' require 'rails/all' Bundler.require(*Rails.groups) module Moviest class Application < Rails::Application config.load_defaults 5.1 config.i18n.load_path += Dir[Rails.root.join('my/locales/*.{rb,yml}')] config.i18n.default_locale = :ja config.action_view.embed_authenticity_token_in_remote_forms = true config.time_zone = 'Tokyo' config.active_record.default_timezone = :local end end
3. application_controller.rb
class ApplicationController < ActionController::Base before_action :set_request protect_from_forgery with: :exception include SessionsHelper def set_request Thread.current[:request] = request end around_action :switch_locale def switch_locale(&action) locale = params[:locale] || I18n.default_locale I18n.with_locale(locale, &action) end def default_url_options { locale: I18n.locale } end 〜〜〜〜 end
4. users_controller_test.rb
require 'test_helper' class UsersControllerTest < ActionDispatch::IntegrationTest def setup @user = users(:michael) @other_user = users(:archer) end ~ test "should redirect edit when not logged in" do get edit_user_path(@user) #該当箇所、pathに関する部分がエラーになっている assert_not flash.empty? assert_redirected_to login_url end ~ end
コメント
国際化の導入は基本的に以下を参考にしました。
Railsアプリを多言語化に対応して国際的アプリにする 【設定編】
初学者のため、至らない部分がありましたら申し訳ございません。
必要なソースコードがありましたら、随時追加しますので、教えていただければと思います。
よろしくお願いします。

回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。