In Rails, how to specify default flash messages in i18n locale file

。_饼干妹妹 提交于 2019-12-02 20:28:09

The Rails i18n guide section 4.1.4 on "lazy" lookups says:

Rails implements a convenient way to look up the locale inside views

(Emphasis theirs, and implying to me, at least, that it is restricted only to views...) However, it seems that this commit to Rails brought "lazy" lookups into controllers as well, with the key being in the form of:

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

which in your case should get you users.create.notice.

So, if you're happy with something like:

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

You should be able to just declare that value in:

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

I know this doesn't take you quite all the way of having a default spot where Rails would automatically go and fetch a flash notice on failure to create a user, but it's a bit better than typing out a full i18n key every time.

I think that currenly (Fall 2015) the most graceful and somewhat conventional way to implement lazy flash messages for you controllers is to use responders gem:

gem 'responders', '~> 2.1'

FlashResponder sets the flash based on the controller action and resource status. For instance, if you do: respond_with(@post) on a POST request and the resource @post does not contain errors, it will automatically set the flash message to "Post was successfully created" as long as you configure your I18n file:

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."

This allows to completely remove flash-related code from the controllers.

However, as you have already understood, you'll need to rewrite your controllers with their respond_with method for that:

# app/controllers/users_controller.rb

class UsersController < ApplicationController
  respond_to :html, :json

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

Follow-up for @robertwbradford's comment on testing, in a Rails 4 / MiniTest functional (controller) test, you can call the translate method on the @controller instance variable:

assert_equal @controller.t('.notice'), flash[:notice]
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!