web-dev-qa-db-ja.com

Railsで、i18nロケールファイルでデフォルトのフラッシュメッセージを指定する方法

Railsが値を自動的にプルするように、i18nロケールファイルにいくつかのプリセット構造があることを知っています。たとえば、新しいレコードのデフォルトの送信ボタンテキストを設定する場合:

_# /config/locales/en.yml
en:
  helpers:
    submit:
      create: "Create %{model}"
      user:
        create: "Sign Up"
_

このセットを使用すると、ビューで次のようになります。

_# /app/views/things/new.html.erb
<%= f.submit %> #=> Renders a submit button reading "Create Thing"

# /app/views/users/new.html.erb
<%= f.submit %> #=> Renders a submit button reading "Sign Up"
_

したがって、Railsは、さまざまなモデルの送信ボタンテキストを取得するために事前設定された階層を使用します(つまり、_f.submit_を使用するときに取得するi18nテキストを指定する必要はありません)。フラッシュ通知とアラートを使用してこれを行う方法を見つけようとしていますが、デフォルトのフラッシュメッセージを指定するための同様のプリセット構造はありますか?

次のように、独自の任意の構造を指定できることを知っています。

_# /config/locales/en.yml
en:
  controllers:
    user_accounts:
      create:
        flash:
          notice: "User account was successfully created."

# /app/controllers/users_controller.rb
def create
  ...
  redirect_to root_url, notice: t('controllers.user_accounts.create.flash.notice')
  ...
end
_

しかし、毎回notice: t('controllers.user_accounts.create.flash.notice')を指定するのは面倒です。コントローラがロケールファイルで指定された適切なフラッシュメッセージを取得して表示するタイミングを「認識」するようにこれを行う方法はありますか?もしそうなら、これらのデフォルトのYAML構造は何ですか?

23
robertwbradford

「レイジー」ルックアップに関するRails i18nガイドセクション4.1.4 は次のように述べています。

Railsは、views内のロケールを検索する便利な方法を実装しています

(彼らの強調、そして少なくとも私にはそれがビューだけに制限されていることを暗示しています...)しかし、 このRailsへのコミット はコントローラーにも「怠惰な」ルックアップをもたらしたようです。キーは次の形式になっています:

"#{ controller_path.gsub('/', '.') }.#{ action_name }#{ key }"

あなたの場合、あなたはusers.create.notice

したがって、次のようなものに満足している場合:

# /app/controllers/users_controller.rb
def create
  ...
  redirect_to root_url, notice: t('.notice')
  ...
end

次の場所でその値を宣言できるはずです。

# /config/locales/en.yml
en:
  users:
    create:
      notice: "User account was successfully created."

Railsは、ユーザーの作成に失敗したときに自動的にフラッシュ通知を取得するデフォルトのスポットを用意するのに十分な方法ではないことを私は知っていますが、入力するよりも少し良いです毎回完全なi18nキーを出します。

29
Paul Fioravanti

現在(Fall 2015)コントローラーにレイジーフラッシュメッセージを実装するための最も優雅でやや従来の方法は、respondersgemを使用することだと思います。

gem 'responders', '~> 2.1'

FlashResponderは、コントローラーのアクションとリソースのステータスに基づいてフラッシュを設定します。たとえば、次のようにすると、POSTリクエストでrespond_with(@post)、リソース@postにエラーが含まれていない場合、設定している限り、フラッシュメッセージは自動的に"Post was successfully created"に設定されます。 I18nファイル:

flash:
  actions:
    create:
      notice: "%{resource_name} was successfully created."
    update:
      notice: "%{resource_name} was successfully updated."
    destroy:
      notice: "%{resource_name} was successfully destroyed."
      alert: "%{resource_name} could not be destroyed."

これにより、コントローラーからflash関連のコードを完全に削除できます。

ただし、すでに理解しているように、そのためにはrespond_withメソッドを使用してコントローラーを書き直す必要があります。

# app/controllers/users_controller.rb

class UsersController < ApplicationController
  respond_to :html, :json

  def show
    @user = User.find params[:id]
    respond_with @user
  end
end
7
jibiel

テストに関する@robertwbradfordのコメントのフォローアップ、Rails 4/MiniTest機能(コントローラー)テストでは、@ controllerインスタンス変数でtranslateメソッドを呼び出すことができます:

assert_equal @controller.t('.notice'), flash[:notice]
3
Lucas Nelson