2017-08-07 78 views
2

我想在Devise使用的其中一个国际化字符串中使用资源属性。我从Devise::SessionsController创造了一个新的SessionsController它继承和它,我已经覆盖create方法,如:如何在I18n上使用资源属性设计flash消息

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#创建操作和控制器。

回答

1

您应该通过options中的nameset_flash_message!的参数。

set_flash_message!(:notice, :signed_in, { name: resource.name })

+1

我做了一个'flash [:notice]'也使用'signed_in'并传递资源属性作为值的工作,但它似乎是最好的方法,谢谢! –

1

我也没有它的工作只是在create方法创建flash[:notice]消息:

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

但@安德烈的回答也完美的作品。