这是一个简单的问题。但我想知道是否有更好的解决方案
我正在使用Devise的current_user在导航栏上显示用户的用户名。
<% if user_signed_in? %>
<li class="someclass"> hi,<%= current_user.username %>
...
我允许用户通过编辑帐户设置页面编辑他们的用户名,我也使用验证来阻止用户选择保留的用户名(如管理员,支持等),以便用户尝试将用户名编辑为无效的用户名让我们说输入'admin',表单将返回验证错误消息。这很有效。
但是,我注意到如果用户尝试将其用户名更改为“admin”,则在显示验证错误消息的表单中,问候语将显示“hi,admin”。我知道由于验证,用户名不会保存到数据库中。如果我离开页面,问候语将恢复正常“嗨,JhonDoe1”
这是我的控制器方法来更新这个
class ProfilesController < Devise::RegistrationsController
def update_settings
if @user.update_with_password(user_params_settings)
flash[:notice] = 'Your account was successfully updated!'
redirect_to settings_path
else
render "settings"
end
end
def user_params_settings
params.required(:user).permit(:username, :email, :current_password)
end
我可以使用以下代码来解决此问题,因此当用户尝试提交无效的用户名时,问候语将保持说:“嗨,JhonDoe1”
<% if user_signed_in? %>
<li class="someclass"> hi,<%= User.find(current_user.id).username %>
...
但是这段代码会生成1个额外的查询(因此会有2个类似的用户查询)
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]]
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]]
并且由于此代码几乎在应用程序的每个页面中都被调用,因此这无效。有什么建议吗?