我的格式如下:
<%= form_with(model: user, local: true) do |form| %>
<% if user.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(user.errors.count, "error") %> prohibited this user from being saved:</h2>
<ul>
<% user.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= form.file_field :avatar %>
</div>
<div class="actions">
<%= form.submit %>
</div>
<% end %>
正在我的edit
页面上调用它:
<h1>Upload Avatar</h1>
<%= image_tag(@user.avatar) %>
<%= render 'form', user: @user %>
<hr>
我收到标题错误,但是我不确定为什么头像没有附加到user
模型上。我已经完成了active_storage
的所有要求。
has_one_attached :avatar
in user model
。
在user controller
中:
def identity_params
params.permit(:email_confirmation, :password, :password_confirmation, :avatar).to_h.symbolize_keys.tap do |params|
params[:email] = params[:email_confirmation]
end
end
我还有所有必要的迁移。我是否缺少实际的头像附加逻辑?
答案 0 :(得分:7)
如果尝试在视图中显示不存在的附件,则会收到错误消息“无法将图像解析为URL:to_model委托给附件,但附件为零” :
<%= image_tag(@user.avatar) %>
为避免错误,您应该这样做:
<%= image_tag(@user.avatar) if @user.avatar.attached? %>
答案 1 :(得分:1)
似乎您缺少配置(因为您没有提到它):
您必须在config/storage.yml
中声明活动存储服务
文档示例:
local:
service: Disk
root: <%= Rails.root.join("storage") %>
test:
service: Disk
root: <%= Rails.root.join("tmp/storage") %>
amazon:
service: S3
access_key_id: ""
secret_access_key: ""
,您必须通过设置Rails.application.config.active_storage.service
由于每种环境可能会使用不同的服务,因此建议根据每个环境使用此服务。要在开发环境中使用上一个示例中的磁盘服务,请将以下内容添加到
config/environments/development.rb
:
# Store files locally.
config.active_storage.service = :local
答案 2 :(得分:1)
由于愚蠢的错误,我也面临着同样的错误。实际上,我在 local:键中添加了额外的空间。因此,请确保您遵循正确的缩进。并且不应该错过配置。您必须通过以下方式在config / storage.yml中声明Active Storage服务。
local:
service: Disk
root: <%= Rails.root.join("storage") %>
test:
service: Disk
root: <%= Rails.root.join("tmp/storage") %>
amazon:
service: S3
access_key_id: ""
secret_access_key: ""
bucket: ""
region: "" # e.g. 'us-east-1'
确保在environment / development.rb,environment / production.rb和environment / test.rb中添加了以下代码行
config.active_storage.service = :local #environment/development.rb
config.active_storage.service = :amazon ##environment/production.rb
config.active_storage.service = :test #environment/test.rb
答案 3 :(得分:1)
如果您的用户型号为UUID,则为
您需要通过在line_size
字段中向ActiveStorage迁移中添加ActiveStorage
来稍微修改type: :uuid
迁移
record
参考https://edgeguides.rubyonrails.org/active_storage_overview.html#setup