ruby-on-rails - 文件扩展名的 Shrine 验证不允许 Facebook 图片
问题描述
我将 Srhine 用于我的项目中的图像,并使用 Omniauth gems 通过 Google 和 Facebook 进行日志记录。
我从 Omniauth 提供程序获取数据的方法是标准方法:
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.email = auth.info.email
user.name = [auth.info.first_name, auth.info.last_name].join(" ")
user.password = Devise.friendly_token[0, 20]
user.avatar_remote_url = auth.info.image
end
end
它允许我通过 Google 和 Facebook 登录并获取用户数据、姓名和图像。我也有标准注册和更新 user.avatar 的可能性,所以我想验证图像,使其大小有限,扩展也有限。我在 Uploader 类中编写了以下验证:
Attacher.validate do
validate_max_size 2*1024*1024
# validate_extension %w[jpg jpeg png webp]
end
问题是扩展验证不允许通过 Facebook 注册新用户。如果 FBauth.info.image
并没有真正返回指向图像'https://blabla/image.jpg'
的链接,而是创建一个链接,当您将其粘贴到浏览器中时,会导致将图像直接下载到硬盘驱动器。如何编写此验证以允许保存提供图像的 FB 方式?或者也许我怎样才能在 Omniauth 方法中跳过这个验证?
解决方案
Shrine::Attacher
您可以在附加文件之前在上下文哈希中设置自定义标志:
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.email = auth.info.email
user.name = [auth.info.first_name, auth.info.last_name].join(" ")
user.password = Devise.friendly_token[0, 20]
user.avatar_attacher.context[:omniauth] = true # <=== set the flag
user.avatar_remote_url = auth.info.image
end
end
然后在validate
块中,如果存在标志,您可以访问它并跳过扩展验证:
Attacher.validate do
validate_max_size 2*1024*1024
validate_extension %w[jpg jpeg png webp] unless context[:omniauth]
end
推荐阅读
- excel - 使用循环播放 MP3 文件
- reactjs - 如何在谷歌云平台更新/修改已部署的静态 ReactJS 站点?
- r - 如何将 scale_y_datetime 与 difftime 数据一起使用?
- webpack - 通过 Webpack 将 SCSS 导入 PostCSS
- jquery - 尝试从 Web 应用程序获取数据时出现 Cors 错误(没有“访问控制允许来源”/它没有 HTTP ok 状态。)
- java - 如何在 LocalDate 列上使用 RowFilter.dateFilter
- ios - 如何在 AnyPublisher 中包装异步函数?
- php - Laravel 中的 createMany 上的 createMany?
- python - 使用 Scrapy 从网站中提取所有下一页
- android - Android Studio 中的所有元素都会自动对齐到左上角。我该如何解决?