前提・実現したいこと
以下の要領で、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/}
試したこと
scopeの定義にresource :rootやresource :homeを加えてみたりしましたが、そこでrake routesで確認してもなんだか違う気がしました。localeをsessionで持ち回る方式はお勧めできないと書いている方がいらっしゃったので試していません。その他、inquiry_controllerにbefore_action :set_localeを加えてみても変化なし、/contactに遷移した時点でlocale値がenに戻ります(contactメソッド内でbinding.pryで確認しました)。
どんなアドバイスでも構いませんので、よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー