質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

891閲覧

Rails 国際化(i18n)の導入によるエラー(No route matches)

jack20xx

総合スコア45

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2022/11/09 14:06

前提

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

〜〜〜〜

  1. 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アプリを多言語化に対応して国際的アプリにする 【設定編】

初学者のため、至らない部分がありましたら申し訳ございません。
必要なソースコードがありましたら、随時追加しますので、教えていただければと思います。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

本テストはRails Tutorialを参考にテスト駆動開発を行なっており、localeには対応していなかったのが原因でした。
テストのsetupにてlocaleを定義し、@userを呼び出す際に指定したlocaleを呼び出すことで、エラーをなくすことができました。
ご閲覧いただき、ありがとうございました。

投稿2022/11/22 16:09

jack20xx

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問