Encore une fois, j'ai des problèmes avec form_for.Rails, form_for et trombone
j'ai un modèle d'activité, et ressembler à:
class Activity < ActiveRecord::Base
has_many :acdocs, dependent: :destroy, autosave: true
accepts_nested_attributes_for :acdocs,
reject_if: proc { |attributes| attributes['descr'].blank?},
allow_destroy: true
end
et moi avons un modèle acdoc. acdoc est l'abréviation de document d'activité. o lire quelque part que si j'ai utilisé le mot "document" je pourrais avoir quelques problèmes avec JavaScript ... alors mieux vaut prévenir que guérir.
Puisque l'activité peut avoir plusieurs acdocs, j'utiliser un form_for pour poignées:
<%= f.fields_for :acdocs do |acdocs| %>
<div>
<%= acdocs.label :descr" %>
<%= acdocs.text_field :descr %>
<%= acdocs.label :document %>
<%= acdocs.file_field :document b%>
</div>
<% end %>
<p>
<%= f.submit 'add doc', :name => "add_item" %>
</p>
<div class="actions">
<%= f.submit %>
</div>
Et pour le contrôleur, j'utiliser ceci:
def new
@activity = Activity.new
@activity.acdocs.build
end
def create
@activity = Activity.new(activity_params)
if params[:add_item]
@activity.acdocs.build
render :action => 'new'
else
respond_to do |format|
if @activity.save
format.html { redirect_to @activity, notice: 'Activity was successfully created.' }
format.json { render action: 'show', status: :created, location: @activity }
else
format.html { render action: 'new' }
format.json { render json: @activity.errors, status: :unprocessable_entity }
end
end
end
end
def update
if params[:add_item]
unless params[:activity][:acdocs_attributes].blank?
for attribute in params[:activity][:acdocs_attributes].permit!
@activity.acdocs.build(attribute.last.except(:_destroy)) unless attribute.last.has_key?(:id)
end
end
@activity.acdocs.build
render :action => 'edit'
else
respond_to do |format|
if @activity.update(activity_params)
format.html { redirect_to @activity, notice: 'Activity was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @activity.errors, status: :unprocessable_entity }
end
end
end
end
Cette configuration, fonctionne un peu . Si je "add_item" un tas de champs et sélectionnez les fichiers, tous sont ensuite téléchargés.
Le problème pour moi est, quand un utilisateur appuie sur add_item, ou même, modifier une activité enregistrée, le formulaire va s'ouvrir. Avec les Itens, le bouton attach file et le texte: "no file attached". Je suis sûr que ce fichier est destiné à dire seulement à l'utilisateur que le fichier est téléchargé à partir de (à partir de son propre ordinateur) plutôt que le fichier stocké sur l'application ... mais cela fera croire à l'utilisateur qu'aucun fichier n'a été téléchargé.
Comment puis-je mettre un texte en disant que le fichier est là, quand il est là?
Aussi, ce n'est pas la première fois que j'ai des problèmes similaires avec la forme pour. Parfois, je veux montrer quelque chose si l'objet est déjà dans la base de données. ou si c'est un nouveau. (comme, montrer une "case à cocher détruire" pour les éléments existants, mais masquer pour les nouveaux)
Comment puis-je faire ces choses?
La chose est, je suis à l'intérieur d'un formulaire_for. Donc, l'objet document que j'ai à l'intérieur, inst le bon objet. C'est un assistant de création de formulaire: la méthode undefined 'existe? ' pour –
Techmago