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

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

ただいまの
回答率

89.55%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 679

ymatt

score 18

 前提・実現したいこと

以下の要領で、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で確認しました)。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • takumiabe

    2018/09/19 02:25

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

    キャンセル

  • ymatt

    2018/09/21 18:14

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

    キャンセル

回答 1

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.55%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる