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?
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