web-dev-qa-db-fra.com

Impossible de résoudre l'image en URL: to_model délégué à la pièce jointe, mais la pièce jointe est nulle Rails 5.2

J'ai le formulaire suivant:

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

Il est appelé sur ma page edit:

<h1>Upload Avatar</h1>
  <%= image_tag(@user.avatar) %>
  <%= render 'form', user: @user %>
<hr>

J'obtiens l'erreur dans le titre mais je ne sais pas pourquoi l'avatar n'est pas attaché au modèle user. J'ai toutes les exigences pour active_storage.

has_one_attached :avatar dans user model.

Dans 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 

J'ai également toutes les migrations nécessaires. Suis-je absent de la logique d'attachement de l'avatar?

6
A.J

Il semble que vous manquiez de configuration (car vous ne le mentionnez pas):

Vous devez déclarer les services de stockage actif dans config/storage.yml

Exemple de documents:

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: ""

et vous devez indiquer à Active Storage le service à utiliser en définissant Rails.application.config.active_storage.service

Étant donné que chaque environnement utilisera probablement un service différent, il est recommandé de le faire en fonction de l'environnement. Pour utiliser le service de disque de l'exemple précédent dans l'environnement de développement, vous devez ajouter ce qui suit à config/environments/development.rb:

# Store files locally.
config.active_storage.service = :local
2
Paulo Belo