Rails 4 plusieurs pièces jointes avec un Trombone
Je suis conscient qu'il y a plusieurs posts sur Stackoverflow et plusieurs tutoriels sur ce sujet. Aucun d'eux cependant réussi à résoudre mon problème, et la plupart d'entre eux sont obsolètes.
Je suis en train d'ajouter plusieurs images à un projet en utilisant le trombone gem dans les Rails 4.
Lorsque j'essaie de le télécharger, je ne vois l'actif lié dans les params.
Ils ne semblent pas être ajouté à la project_paramns mais..
Espère que quelqu'un pourra m'aider ici.
C'est mon projects_controller
class ProjectsController < ApplicationController
before_filter :find_project, only: [:show, :edit, :update, :destroy]
def index
@projects = Project.all
end
def show
end
def new
@project = Project.new
end
def create
@project = Project.new(project_params)
@project.save
redirect_to project_path(@project)
end
def edit
end
def update
@project.update(project_params)
redirect_to project_path(@project)
end
def destroy
@project.destroy
redirect_to projects_path
end
protected
def project_params
params.require(:project).permit(:name, :description, :asset)
end
def find_project
@project = Project.find(params[:id])
end
end
Mon projet modèle
class Project < ActiveRecord::Base
has_many :assets, :dependent => :destroy
validates_associated :assets
validates_presence_of :name, :on => :create, :update => "can't be blank"
validates_presence_of :description, :on => :create, :update => "can't be blank"
accepts_nested_attributes_for :assets
end
Mon modèle de l'immobilisation
class Asset < ActiveRecord::Base
belongs_to :project
# Paperclip
has_attached_file :image,
:styles => {
:thumb=> "100x100#",
:small => "150x150>",
:medium => "300x300>",
:large => "400x400>" }
validates_attachment :image, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png", "image/gif"] }
end
Et ma forme partielle (Désolé c'est en HAML)
= simple_form_for @project do |f|
%ul
- @project.errors.full_messages.each do |error|
%li= error
.row
.small-1.columns
= f.label :name, :class => "left inline"
.small-11.columns
= f.input_field :name
.row
.small-1.columns
= f.label :description, :class => "left inline"
.small-11.columns
= f.input_field :description, as: :text
.row
= f.simple_fields_for :asset do |a|
.small-1.columns
= a.label :image, :class => "left inline"
.small-11.columns
= file_field_tag :image, multiple: true,
.row
.small-9.small-offset-1.columns
= f.submit nil ,:class => "button [radius round]"
Les Paramètres De La Demande
{"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"4iK1kUNvKvoJVOKoivz/pcLAe6LY0cUJikQioxa8BIs=", "project"=>{"name"=>"adf", "description"=>"adf", "asset"=>{"image"=>[#<ActionDispatch::Http::UploadedFile:0x007fb808357d80 @tempfile=#<Tempfile:/var/folders/v_/98sxm8bn24qbqj_jmj40fv400000gn/T/RackMultipart20140607-34739-dvlzt7>, @original_filename="enabling-gzip-compression.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"project[asset][image][]\"; filename=\"enabling-gzip-compression.jpg\"\r\nContent-Type: image/jpeg\r\n">, #<ActionDispatch::Http::UploadedFile:0x007fb808357d58 @tempfile=#<Tempfile:/var/folders/v_/98sxm8bn24qbqj_jmj40fv400000gn/T/RackMultipart20140607-34739-lwkioi>, @original_filename="minimize_http_requests.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"project[asset][image][]\"; filename=\"minimize_http_requests.png\"\r\nContent-Type: image/png\r\n">]}}, "commit"=>"Update Project", "action"=>"update", "controller"=>"projects", "id"=>"11"}
Maintenant, j'ai aussi eu une erreur en montrant dans mon terminal:
Unpermitted parameters: asset
Edit:
Une combinaison de @pavan et @kiri thorat réponses m'ont aidé à obtenir quelque chose à montrer dans la project_params, la sortie donne maintenant est:
{"name"=>"Test", "description"=>"Test", "assets_attributes"=>{"0"=>{}}}
Aucun indice sur ce qui se passe ici?
Après @kirithorat de la dernière mise à jour, les choses semblent bonnes sur le paramètre côté des choses.
{"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"4iK1kUNvKvoJVOKoivz/pcLAe6LY0cUJikQioxa8BIs=", "project"=>{"name"=>"Test", "description"=>"Test", "assets_attributes"=>{"0"=>{"image"=>#<ActionDispatch::Http::UploadedFile:0x007fcd383c9a08 @tempfile=#<Tempfile:/var/folders/v_/98sxm8bn24qbqj_jmj40fv400000gn/T/RackMultipart20140610-36517-7ek1oq>, @original_filename="enabling-gzip-compression.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"project[assets_attributes][0][image]\"; filename=\"enabling-gzip-compression.jpg\"\r\nContent-Type: image/jpeg\r\n">}}}, "commit"=>"Update Project", "action"=>"update", "controller"=>"projects", "id"=>"13"}
Les actifs ne sont toujours pas enregistrés.
Mise à jour après la mise en œuvre de @Valikiliy les suggestions de
{"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"4iK1kUNvKvoJVOKoivz/pcLAe6LY0cUJikQioxa8BIs=", "project"=>{"name"=>"Test", "description"=>"Test", "image"=>#<ActionDispatch::Http::UploadedFile:0x007fcd3a08d0b8 @tempfile=#<Tempfile:/var/folders/v_/98sxm8bn24qbqj_jmj40fv400000gn/T/RackMultipart20140610-36517-rgy95n>, @original_filename="minimize_http_requests.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"project[image]\"; filename=\"minimize_http_requests.png\"\r\nContent-Type: image/png\r\n">}, "commit"=>"Update Project", "action"=>"update", "controller"=>"projects", "id"=>"16"}
Mise à jour: Ajout d'une nouvelle forme de code sur demande
= simple_form_for(@project, :html => { :multipart => true }) do |f|
%ul
- @project.errors.full_messages.each do |error|
%li= error
.row
.small-1.columns
= f.label :name, :class => "left inline"
.small-11.columns
= f.text_field :name
.row
.small-1.columns
= f.label :description, :class => "left inline"
.small-11.columns
= f.text_area :description
.row
= f.simple_fields_for :assets do |a|
.small-1.columns
= a.label :image, :class => "left inline"
.small-11.columns
- if a.object.new_record?
= a.input :image, as: :file
- else
= image_tag a.object.image.url(:thumb)
= a.input_field '_destroy', as: :boolean
.row
.small-9.small-offset-1.columns
= f.submit nil ,:class => "button [radius round]"
Mise à jour
def project_params
params.require(:project).permit(:name, :description, images: [], assets_attributes: [:_destroy, :id, :image])
end
def find_project
@project = Project.find(params[:id])
@project.assets.build if %w[new edit].include?(action_name)
end
Mise à jour: Ajout du code du modèle
class Project < ActiveRecord::Base
has_many :assets, :dependent => :destroy
validates_presence_of :name, :on => :create, :update => "can't be blank"
validates_presence_of :description, :on => :create, :update => "can't be blank"
accepts_nested_attributes_for :assets, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true
end
OriginalL'auteur Weszzz7 | 2014-06-07
Vous devez vous connecter pour publier un commentaire.
Pour enregistrer plusieurs fichiers dans l'exemple ci-dessus, vous n'avez pas besoin d'ajouter multiples: vrai option, il va provoquer une erreur lors de la sauvegarde, un fichier d'un enregistrement tableau des actifs.
Pour résoudre ce problème, vous pouvez ajouter plusieurs champs de fichier, comme ceci:
ajouter dans le contrôleur:
pour tout liste de
et en vue comme:
Si vous essayez d'envoyer plusieurs images comme ceci:
Cela provoquerait une erreur parce que le modèle de l'Immobilisation ne sais pas quoi faire avec un tableau d'images.
À sauver plus d'un fichier dans le même temps, vous devez utiliser votre propre gestionnaire, par exemple:
modèle: ajouter la
images=
méthodecontrôleur: déplacer
images: []
à l'extérieur de la assets_attributesvue: supprimer le fields_for et imbriqués les attributs
Pour résoudre votre problème, lire l'article: mise à Jour 1.
J'ai mis en œuvre les modifications de la mise à Jour de 1 et il n'est toujours pas d'économie d'actifs. 🙁
Montrer que vous Vous connectez Après le post du formulaire.
Publié dans la question d'origine
OriginalL'auteur Vakiliy
Vous avez de 1 M de la relation entre
Project
etAsset
modèles c'est à dire,Projet has_many actifs
donc, dans votre formulaire partielle
simple_fields_for
devrait ressembler àAvis
assets
dans pluriel et PASasset
dans singulierDans votre code, vous avez utilisé
simple_fields_for
avec singulierasset
c'est pourquoi votreparams
est générée de façon incorrecte et vous recevezasset
clé dansparams
de hachage au lieu de recevoirassets_attributes
clé qui entraîne le message d'avertissement commeUnpermitted parameters: asset
.Une fois que vous corriger la forme partielle, vous recevrez les bonnes touches dans
params
de hachage lors de la soumission du formulaire. Maintenant, comme @Pavan a souligné problème suivant que je vois, c'est que vous n'avez pas autorisé laassets_attributes
correctement dans le contrôleur.Vous devez mettre à jour les
project_params
méthode que ci-dessous:Avis
assets_attributes
avecassets
dans plurielMise à JOUR
Vous devrez ajouter
@project.assets.build
dansnew
etedit
action deProjectsController
afin de voir les champs de l'actif dans lenew
etedit
vue.Aussi, je suggère l'ajout de
:id
dans la liste des permis d'attributs pourassets_attributes
dansproject_params
comme ci-dessous:Peu plus de problèmes que je vois, c'est dans le
form partial
sontQue vous téléchargez un fichier, vous devez spécifier
:html => {:multipart => true}
dans le formulaire.Changement
À
Projet has_many actifs et tous les
asset
aurait un seulimage
, afin de supprimermultiple: true
. Aussi, tant que vous utilisezsimple_form
, son conseillé de l'utilisersimple_form
méthode d'assistance pour le téléchargement de fichier.Changement
À
Bonne prise sur le pluriel(actifs) chose. J'ai pas remarqué ça!.
Lire la section mise à JOUR dans ma réponse, j'ai ajouté un peu plus de pointeurs pour vous.
Merci pour la mise à jour, les choses vont assez bien maintenant sauf qu'ils ne sont toujours pas enregistrés. Je vais mettre à jour ma question d'origine avec la dernière sortie après la mise en œuvre de vos modifications.
OriginalL'auteur Kirti Thorat
Votre
project_params
devrait ressembler à ceciEt aussi,pourquoi vous utilisez
protected
? je suppose que vous devriez être en utilisantprivate
.Vous pouvez publier des informations de journal dans la question, s'il vous plaît?
Et aussi essayer d'utiliser
private
au lieu deprotected
.J'ai ajouté des paramètres de la requête à ma question. Changer privé n'a pas changé un truc bien 🙁
Votre journal d'informations semble bizarre pour moi.Il n'y a pas de
asset params
.Essayez de redémarrer le serveur et de le faire avec ma proposition de réponse.OriginalL'auteur Pavan