我正在使用:
Rails 6.0.4.4
红宝石3.0.0
我已将
gem'active_storage_validations'
添加到我的项目中,并尝试使用它来验证 附加的头像是图像
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable, :confirmable, :trackable, :lockable, :masqueradable
validates :first_name, :last_name, presence: true
validates :email, uniqueness: true
validates :terms_and_conditions, acceptance: true
validates :avatar, attached: true, content_type: ['image/png', 'image/jpg', 'image/jpeg']
has_one_attached :avatar
end
在我的注册表单中
<%= render "devise/shared/error_messages", resource: resource %>
<div class="container pt-3 pb-3">
<div class="card">
<div class="card-header">
<h2>Sign up</h2>
</div>
<div class="card-body">
<%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<div class="field mb-3">
<%= f.label :profile_picture %><br />
<%= f.file_field :avatar, class: "form-control" %>
</div>
<div class="field mb-3">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true, autocomplete: "email", class: "form-control", placeholder: "[email protected]" %>
</div>
<div class="field mb-3">
<%= f.label :first_name %><br />
<%= f.text_field :first_name, required: true, autofocus: true, autocomplete: "first_name", class: "form-control" %>
</div>
<div class="field mb-3">
<%= f.label :last_name %><br />
<%= f.text_field :last_name, autofocus: true, autocomplete: "last_name", class: "form-control" %>
</div>
<div class="field mb-3">
<%= f.label :password %>
<% if @minimum_password_length %>
<em>(<%= @minimum_password_length %> characters minimum)</em>
<% end %><br />
<%= f.password_field :password, autocomplete: "new-password", class: "form-control" %>
</div>
<div class="field mb-3">
<%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, autocomplete: "new-password", class: "form-control" %>
</div>
<div class="form-check form-switch text-muted">
<%= f.check_box :terms_and_conditions, class: 'form-check-input', id: 'flexSwitchCheckDefault' %>
I hereby confirm I have read and undertood the terms and conditions
</div>
<div class="actions">
<%= f.submit "Continue", class: "btn btn-primary" %>
</div>
<% end %>
<br>
<%= render "devise/shared/links" %>
</div>
</div>
</div>
所有其他验证工作正常。
如果我在附加图像上添加文件类型或大小的验证,它仍然允许用户上传任何文件类型和大小
我是
active_storage_validation
gem 的维护者,我不确定你是否在期待这里。
首先你需要限制UI部分的用户输入,这位于accept HTML属性中,即输入元素中的
accept="image/png, image/jpg, image/jpeg"
。这样,您的用户将只能上传这些内容类型文件,这将增强用户体验。
然后您将在模型上运行验证,这就是
active_storage_validation
发挥作用的地方。 content_type
验证器具有以下保护子句 (return true unless record.send(attribute).attached?
(here)),因此如果您不附加任何内容,则不会引发错误。这减少了发送的错误数量。
我认为添加
accept
HTML 属性将解决您的大多数情况。
如果没有,我们可以在 gem repo 中讨论这个问题