current_user设计无效表单

时间:2017-02-17 04:03:51

标签: ruby-on-rails devise

这是一个简单的问题。但我想知道是否有更好的解决方案

我正在使用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]]

并且由于此代码几乎在应用程序的每个页面中都被调用,因此这无效。有什么建议吗?

0 个答案:

没有答案