Не удается преобразовать изображение в URL: to_model делегирован во вложении, но вложение равно nil Rails 5.2 - PullRequest
0 голосов
/ 15 января 2019

У меня есть следующая форма:

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

Также у меня есть все необходимые миграции. Я скучаю по фактической логике присоединения аватара?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Вы можете получить сообщение об ошибке "Невозможно разрешить изображение в URL: to_model делегирован во вложении, но вложение равно nil" , если вы пытаетесь показать в своем представлении несуществующее вложение:

<%= image_tag(@user.avatar) %>

, чтобы избежать ошибки, вы должны сделать это:

<%= image_tag(@user.avatar) if @user.avatar.attached? %>
0 голосов
/ 15 января 2019

Кажется, вам не хватает конфигурации (потому что вы не упоминаете ее):

Вы должны объявить службы Active Storage в 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: ""

и вы должны указать Active Storage, какую службу использовать, установив Rails.application.config.active_storage.service

Поскольку каждая среда, скорее всего, будет использовать разные службы, рекомендуется делать это для каждой среды. Чтобы использовать службу диска из предыдущего примера в среде разработки, вы должны добавить в config/environments/development.rb следующее:

# Store files locally.
config.active_storage.service = :local
...