2016-06-05 5 views
0

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?

Répondre

0

Vous pouvez vérifier si le fichier existe. Par exemple, vous pouvez vérifier si l'attribut nom_fichier est défini dans votre base, quelque chose comme ça acdoc.document?, ou vous pouvez vérifier si le fichier existe sur le système de fichiers, comme ceci: acdoc.document.exists?

  • show_destroy_checkbox if acdoc.document? ou
  • show_destroy_checkobx if acdoc.document.exists?

Cheers!

+0

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