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

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

新規登録して質問してみよう
ただいま回答率
85.50%
i18n

i18n(Internationalization)とは、ユーザーの国や文化によってソフトウェアの反応を変えることで国際化を図るテクニックやツールのことを言います。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

1586閲覧

Rails 4 / i18n / ロケール値の受け渡しができない

ymatt

総合スコア20

i18n

i18n(Internationalization)とは、ユーザーの国や文化によってソフトウェアの反応を変えることで国際化を図るテクニックやツールのことを言います。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2018/09/16 07:49

前提・実現したいこと

以下の要領で、3ヶ国語のウェブサイトを作成中です。サイトの構造は、ホームページとactionmailerを使った問い合わせフォームだけの簡単なものです。
https://www.uosansatox.biz/entry/2017/08/31/152237

発生している問題

ホームページにて、3ヶ国語で切り替えができるように設定できたのですが、問い合わせフォームにページ遷移した時にlocaleの受け渡しができません。

該当のソースコード

routes.rb => scope内の2つのresourcesを外しても挙動が変わりません。

Rails.application.routes.draw do get 'contact' => 'inquiry#contact' post 'contact/confirm' => 'inquiry#confirm' post 'contact/thanks' => 'inquiry#thanks' root 'static_pages#home' match '/home', to: 'static_pages#home', via: 'get' scope '(:locale)', locale: /#{I18n.available_locales.map(&:to_s).join('|')}/ do resources :static_pages resources :inquiry end end

application_controller.rb => default_url_optionsを消しても挙動が変わりません。

class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception before_action :set_locale def set_locale I18n.locale = locale end def locale @locale ||= params[:locale] ||= I18n.default_locale end def default_url_options(options={}) options.merge(locale: locale) end end

inquiry_controller.rb => contactに遷移する時点でlocaleがデフォルトのenに戻ります。

class InquiryController < ApplicationController def contact # 入力画面を表示 @inquiry = Inquiry.new render :action => 'contact' end def confirm # 入力値のチェック @inquiry = Inquiry.new(params[:inquiry]) if @inquiry.valid? # OK。確認画面を表示 render :action => 'confirm' else # NG。入力画面を再表示 render :action => 'contact' end end def thanks # メール送信 @inquiry = Inquiry.new(params[:inquiry]) InquiryMailer.received_email(@inquiry).deliver # 完了画面を表示 render :action => 'thanks' end end

_dropdown.html.erb => ホームページに設置している言語切り替えボタンです。問い合わせページには設置していません。

<li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Languages <span class="caret"></span></a> <ul class="dropdown-menu"> <li><%= link_to '英語/English', url_for(controller: controller.controller_name, action: controller.action_name, locale: 'en') %></li> <li><%= link_to '中文/Mandarin', url_for(controller: controller.controller_name, action: controller.action_name, locale: 'ma') %></li> <li><%= link_to '日本語/Japanese', url_for(controller: controller.controller_name, action: controller.action_name, locale: 'ja') %></li> </ul> </li>

console => なんかいろいろと間違っている気がします・・・

$ rake routes Prefix Verb URI Pattern Controller#Action contact GET /contact(.:format) inquiry#contact contact_confirm POST /contact/confirm(.:format) inquiry#confirm contact_thanks POST /contact/thanks(.:format) inquiry#thanks root GET / static_pages#home home GET /home(.:format) static_pages#home static_pages GET (/:locale)/static_pages(.:format) static_pages#index {:locale=>/en|ma|ja/} POST (/:locale)/static_pages(.:format) static_pages#create {:locale=>/en|ma|ja/} new_static_page GET (/:locale)/static_pages/new(.:format) static_pages#new {:locale=>/en|ma|ja/} edit_static_page GET (/:locale)/static_pages/:id/edit(.:format) static_pages#edit {:locale=>/en|ma|ja/} static_page GET (/:locale)/static_pages/:id(.:format) static_pages#show {:locale=>/en|ma|ja/} PATCH (/:locale)/static_pages/:id(.:format) static_pages#update {:locale=>/en|ma|ja/} PUT (/:locale)/static_pages/:id(.:format) static_pages#update {:locale=>/en|ma|ja/} DELETE (/:locale)/static_pages/:id(.:format) static_pages#destroy {:locale=>/en|ma|ja/} inquiry_index GET (/:locale)/inquiry(.:format) inquiry#index {:locale=>/en|ma|ja/} POST (/:locale)/inquiry(.:format) inquiry#create {:locale=>/en|ma|ja/} new_inquiry GET (/:locale)/inquiry/new(.:format) inquiry#new {:locale=>/en|ma|ja/} edit_inquiry GET (/:locale)/inquiry/:id/edit(.:format) inquiry#edit {:locale=>/en|ma|ja/} inquiry GET (/:locale)/inquiry/:id(.:format) inquiry#show {:locale=>/en|ma|ja/} PATCH (/:locale)/inquiry/:id(.:format) inquiry#update {:locale=>/en|ma|ja/} PUT (/:locale)/inquiry/:id(.:format) inquiry#update {:locale=>/en|ma|ja/} DELETE (/:locale)/inquiry/:id(.:format) inquiry#destroy {:locale=>/en|ma|ja/}

https://www.uosansatox.biz/entry/2017/08/31/152237には、routes.rbでのscopeの記述によって、”この時点で、/jaや/enをルートパスの次に書いてアクセスしてもエラーにならず、普通にアクセスできるようになります。”とありますが、ルーティングエラーになります。

試したこと

scopeの定義にresource :rootやresource :homeを加えてみたりしましたが、そこでrake routesで確認してもなんだか違う気がしました。localeをsessionで持ち回る方式はお勧めできないと書いている方がいらっしゃったので試していません。その他、inquiry_controllerにbefore_action :set_localeを加えてみても変化なし、/contactに遷移した時点でlocale値がenに戻ります(contactメソッド内でbinding.pryで確認しました)。

どんなアドバイスでも構いませんので、よろしくお願いいたします。

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

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

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

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

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

takumiabe

2018/09/18 17:25

"/contactに遷移"するリンクをどう書きましたか? そちらのviewも示すべきだと思います。
ymatt

2018/09/21 09:14

コメントありがとうございます。/contactに遷移するリンクは/contactのままです。ここはいじるべきでしょうか?いじるとしたら、sessionを使った受け渡しになるのでは?と思っています。
guest

回答1

0

自己解決

<%= link_to t('view.contact'), url_for(controller: :inquiry, action: :contact), :class => 'request' %>
にて/contactに遷移することで解決しました。

投稿2018/09/29 06:05

ymatt

総合スコア20

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問