如何在I18n Devise flash消息上使用资源属性

时间:2017-08-07 23:10:56

标签: ruby-on-rails devise ruby-on-rails-5

我正在尝试在Devise使用的一个国际化字符串中使用资源属性。我创建了一个新的SessionsController,它继承自Devise::SessionsController,在其中,我覆盖了create方法,如:

class SessionsController < Devise::SessionsController
  def create
    self.resource = warden.authenticate!(auth_options)
    set_flash_message!(:notice, :signed_in)
    sign_in(resource_name, resource)
    yield resource if block_given?
    respond_with resource, location: after_sign_in_path_for(resource)
  end
end

我正在重定向到特定路径并传递resource。我可以使用byebug进行调试,并且我看到来自已登录用户的资源及其属性,但我仍然不知道如何传递这些属性以便在“区域设置”消息中使用,例如:

devise:
  sessions:
    user:
      signed_in: 'You have signed in successfully. Welcome %{name}!'

目前name不会打印用户名称中的值,因此,我很想知道如何实现它。

我在_message.html.erb部分显示消息,例如:

<% flash.each do |key, value| %>
  <div class="alert alert-icon alert-dismissible alert-<%= key %> flash-alert" role="alert">
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
      <i class="fa fa-times" aria-hidden="true"></i>
    </button>
    <%= value %>
  </div>
<% end %>

我的路线包括SessionsController:

devise_for :users, controllers: { sessions: 'sessions' }, skip: [:registrations]
  as :user do
    ...
    post 'login', to: 'sessions#create', as: :user_session
  end
end

POST'登录'也指向DeviseSessions #create动作和控制器。

2 个答案:

答案 0 :(得分:1)

您应该通过name的{​​{1}}参数中的options

set_flash_message!

答案 1 :(得分:1)

我在flash[:notice]方法中创建create消息时也做到了:

def create
  ...
  flash[:notice] = I18n.t('devise.sessions.user.signed_in', name: resource.name)
  ...
end

但@André的回答也很有效。