0

Les balises persistent pendant:Comment rendre les balises persistantes lors de la mise à jour?

def update 
    if @goal.update(goal_params) 
     respond_modal_with @goal, location: root_path 
    else 
     render action: 'edit' 
    end 
    end 

mais quand je mets à jour l'objectif via:

def mark_accomplished 
    @goal.update(accomplished: true) 

     respond_to do |format| 
     format.html 
     format.js { render :nothing => true } 
     end 
    end 

Les balises pour cet objectif disparaît lorsqu'un utilisateur clique sur le bouton mark_accomplished:

<%= link_to 'Accomplished', mark_accomplished_path(goal), remote: true, method: 'put', %> 

L'itinéraire:

get '/goal_signup/', to: 'goals#goal_signup', as: 'goal_signup' 

Il a quelque chose à voir avec les étiquettes (gem 'acts-as-taggable-on') parce que ce problème se produit dans des situations similaires avec mes habitudes MVC. J'utilise des objectifs comme exemple principal ici, mais laissez-moi savoir si vous voulez que les habitudes fournissent aussi plus de contexte.

goal.rb

class Goal < ActiveRecord::Base 
    scope :publish, ->{ where(:conceal => false) } 
    belongs_to :user 
    acts_as_taggable 
    scope :accomplished, -> { where(accomplished: true) } 
    scope :unaccomplished, -> { where(accomplished: nil) } 
    before_save :set_tag_owner 

    def set_tag_owner 
     # Set the owner of some tags based on the current tag_list 
     set_owner_tag_list_on(self.user, :tags, self.tag_list) 
     # Clear the list so we don't get duplicate taggings 
     self.tag_list = nil 
    end 
end 

TagsController

class TagsController < ApplicationController 
    def index 
    @tags = ActsAsTaggableOn::Tag.most_used(20) 
    # The tags for all users and habits. 
    @special_tags = ActsAsTaggableOn::Tag.includes(:taggings) 
             .where('taggings.taggable_type' => ['Habit','User','Valuation','Goal']) 
             .most_used(10) 
    # to get tags where the current user is the tagger 
    @user_tags = current_user.owned_tags 
    end 

    def show 
    @tag = ActsAsTaggableOn::Tag.find(params[:id]) 
    end 
end 

db

create_table "taggings", force: true do |t| 
    t.integer "tag_id" 
    t.integer "taggable_id" 
    t.string "taggable_type" 
    t.integer "tagger_id" 
    t.string "tagger_type" 
    t.string "context",  limit: 128 
    t.datetime "created_at" 
    end 

    add_index "taggings", ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "taggings_idx", unique: true, using: :btree 
    add_index "taggings", ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context", using: :btree 

    create_table "tags", force: true do |t| 
    t.string "name" 
    t.integer "taggings_count", default: 0 
    end 

    add_index "tags", ["name"], name: "index_tags_on_name", unique: true, using: :btree 

Répondre

1

mal est before_save :set_tag_owner, vous avez défini self.tag_list = nil. Par conséquent, avant d'enregistrer votre objectif, votre liste de tags sera vidée.

Son travail dans l'action de mise à jour parce que vous définissez à nouveau des balises.

Pour résoudre ce problème, affectez nil à tag_list uniquement lorsque vous souhaitez supprimer des tags.

+1

Écrire des rappels qui dépendent d'une autre classe, le modèle n'est pas une bonne pratique. Vous pouvez donc affecter 'self.tag_list = nil' dans le contrôleur ou vous pouvez écrire une classe de service pour mettre à jour les objectifs et y écrire. –

+0

Vous ne l'avez probablement pas appelé sur l'objet objectif, essayez @ goal.tag_list = nil avant la mise à jour. Ne sois pas désolé de t'avoir fait une erreur humaine. –

+0

@ AnthonyGalli.com Je ne suis pas en mesure d'ouvrir votre question. Vous l'avez probablement résolu vous-même et supprimé la question. –