(GoRails) 使用ActiveStorage给user添加上传头像功能。

对activestorage的简单使用:

头像库:uifaces.co。 可以使用大量设置好的头像图片。

1.安装avatar

  rails active_storage:install

2.user model建立has_one_attached关联。

3.view上面添加代码:可以查看,修改头像

  • 用variant方法设置图像格式,需要安装gem 'mini_magick', (需要brew install imagemagick)
  • 提供了gem 'gravatar_image_tag', 可以使用helper方法

4.代码太多,使用一个helper方法。

module ApplicationHelper
  #...上略...
  def user_avatar(user, size=40)
    if user.avatar.attached?
      user.avatar.variant(resize: "#{size}x#{size}!")
    else
      gravatar_image_url(user.email, size: size)
    end
  end
end

这样_navbar.html.erb中也可以使用这个方法了

5.因为用到了device,所有在controller配置参数白名单:

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  before_action :configure_permitted_parameters, if: :devise_controller?
  before_action :masquerade_user!

  protected

    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
 +    devise_parameter_sanitizer.permit(:account_update, keys: [:name, :avatar])
    end
end

注意:⚠️

Devise error: undefined method `current_sign_in_ip'

首先看devise是否是最新版本gemfile,和gemfile.lock

然后,检查migration中是否加上了这个属性current_sign_in_ip。如果没有的话

  • 第一个办法,user model中去掉devise_for :trackable
  • 第二个办法,加上这个属性,然后rails db:migrate
rails g migration AddTrackingToUsers

class AddTrackingToUsers
  def change
    add_column :users, :current_sign_in_ip, :string
    add_column :users, :last_sign_in_ip, :string
  end
end

rails db:migrate
原文地址:https://www.cnblogs.com/chentianwei/p/10081470.html