无法将图像解析为URL:to_model委托给附件,但附件为nil Rails 5.2

时间:2019-01-14 21:43:14

标签: ruby-on-rails forms model rails-activestorage

我的格式如下:

<%= 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 

我还有所有必要的迁移。我是否缺少实际的头像附加逻辑?

4 个答案:

答案 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

告诉Active Storage使用哪个服务
  

由于每种环境可能会使用不同的服务,因此建议根据每个环境使用此服务。要在开发环境中使用上一个示例中的磁盘服务,请将以下内容添加到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