Ruby on Rails 活动存储验证不起作用

问题描述 投票:0回答:1

我正在使用:

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>

所有其他验证工作正常。

如果我在附加图像上添加文件类型或大小的验证,它仍然允许用户上传任何文件类型和大小

ruby-on-rails ruby rails-activestorage
1个回答
0
投票

我是

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 中讨论这个问题

© www.soinside.com 2019 - 2024. All rights reserved.