23

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

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

# /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 構造は何ですか?

4

3 に答える 3

31

「怠惰な」ルックアップに関するRails i18nガイドのセクション4.1.4には、次のように書かれています。

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

(彼らのものを強調し、少なくとも私には、それがビューだけに制限されていることを暗示しています...)しかし、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 キーを入力するよりは少しましです。

于 2014-03-18T14:13:58.163 に答える
8

現在 ( 2015 年秋)、コントローラーに遅延フラッシュ メッセージを実装する最も優雅でやや伝統的な方法は、respondersgemを使用することだと思います。

gem 'responders', '~> 2.1'

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

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
于 2015-10-27T00:51:10.003 に答える
4

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

assert_equal @controller.t('.notice'), flash[:notice]
于 2015-03-02T20:50:02.927 に答える