更新在Devise

时间:2017-05-18 01:07:07

标签: ruby-on-rails devise

我正在使用Devise和Rails 4.

当我去编辑用户并修改用户名时,我点击了更新,但新用户名未在数据库中修改。更新密码和电子邮件都可以正常工作,只是用户名似乎受到影响。我发现了一个similar question,但据我所知,我没有一个可能导致此问题的before_save操作。

在rails控制台中,当我执行User.first时,这是我在执行更新操作之前看到的:

    => #<User id: 1, email: "blueduckyy@example.com", created_at: "2017-03-03 19:10:48", updated_at: "2017-05-18 00:52:28", username: "blueduckyy", avatar_file_name: nil, avatar_content_type: nil, avatar_file_size: nil, avatar_updated_at: nil>

当我执行更新操作时,我看到这是终端窗口:

      Parameters: {"utf8"=>"✓", "authenticity_token"=>"tFn+73EVxXbaZ4jgVen1iGB5U2yllqbyf/G+nL0Xp+xyRxQQtS2Eq3WTkJi7b1PP/FjduC6kC3X5ERgErjA+Vg==", "user"=>{"username"=>"blueduckyy2"}, "commit"=>"Save"}

在浏览器中,我收到一条回复,表示用户已成功更新。

然后,如果我再次执行User.first,我会得到与上面相同的内容。

这就是我在应用程序控制器中的内容:

def configure_permitted_parameters
  devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
end

如果相关的话,我的注册管理员可以覆盖设计:

    class Users::RegistrationsController < Devise::RegistrationsController

      protected

      def update_resource(resource, params)
        resource.update_without_password(params)
      end

      def after_update_path_for(resource)
        user_path(resource)
      end

    end

我的用户模型:

    class User < ApplicationRecord
      # Include default devise modules. Others available are:
      # :confirmable, :lockable, :timeoutable and :omniauthable
      devise :database_authenticatable, :registerable,
             :recoverable, :rememberable, :trackable, :validatable

             validates :username, presence: true, length: { maximum: 15 }, uniqueness: {case_sensitive: false}

       has_attached_file :avatar, :styles => { :medium => "300x300>",:small => "200x200", :thumb => "100x100" }, :default_url => "/images/:style/missing.png"
       validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/

2 个答案:

答案 0 :(得分:0)

registrations_controller.rb 中输入此内容

class Users::RegistrationsController < Devise::RegistrationsController
 before_filter :configure_permitted_parameters

 def configure_permitted_parameters
  devise_parameter_sanitizer.permit(:sign_up) do |user_params|
   user_params.permit(:first_name, :last_name, :username,
    :email, :password, :password_confirmation)
  end
  devise_parameter_sanitizer.permit(:account_update) do |user_params|
   user_params.permit(:first_name, :last_name, :username,
    :email, :password, :password_confirmation, :avatar)
  end
 end
end

答案 1 :(得分:0)

一个相对干净的解决方案(适用于Rails 6)是将其添加到您的application_controller

  before_action :configure_devise_permitted_parameters, if: :devise_controller?

  def configure_devise_permitted_parameters,
    devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
    devise_parameter_sanitizer.permit(:account_update, keys: [:username])
  end