2017-07-17 11 views
2

Ich habe eine TranslationsUser-Tabelle und eine FavoriteTranslation-Tabelle. Ich möchte, dass ein TranslationsUser nur eine bevorzugte Übersetzung hat, aber ich möchte keine Validierungen verwenden, weil ich möchte, dass mein Controller eine Lieblingsübersetzung ersetzt, falls eine solche bereits existiert. Stattdessen habe ich eine validate_uniqueness Funktion erstellt.Rails/RoR - NoMethodError (undefinierte Methode `destroy 'für nil: NilClass)

Wenn ich versuche, einen TranslationsUser mit einer neuen Liebling Übersetzung zu ersetzen, ich die folgenden Fehler in meinem Terminal erhalten: NoMethodError (undefined method `destroy' for nil:NilClass):

denke ich, das Problem die before action :set_favorite_translation sein kann, da es @favorite_translation

definiert Wenn So, wie kann ich einen bestimmten FavoriteTranslation-Datensatz löschen:

Wenn nicht, bitte helfen Sie mir herauszufinden, was das Problem ist! Danke vielmals.


before_action :set_favorite_translation, only: [:show, :edit, :update, :destroy] 


def create 

    transUser = TranslationsUser.find(favorite_translation_params[:translations_user_id]) 


    @favorite_translation = FavoriteTranslation.new(favorite_translation_params) 
    @favorite_translation.user_id = @current_user.id 

    if validate_uniqueness(transUser) == false 
     transUser.favorite_translations.first.destroy 
    end 

    respond_to do |format| 
     if @favorite_translation.save 
     #format.html { redirect_to @favorite_translation, notice: 'Translations users comment was successfully created.' } 
     format.json { head :no_content } 
     else 
     format.html { render :new } 
     format.json { render json: @favorite_translation.errors, status: :unprocessable_entity } 
     end 
    end 

end 

def validate_uniqueness(transUser) 
     if FavoriteTranslation.joins(:translations_user).where('lang_id = ?', transUser.lang_id).where('favorite_translations.user_id = ?', @current_user.id).where('translations_users.translation_id = ?', transUser.translation_id).exists? 
      return false 
     else 
      return true 
     end 
end 

def destroy 
    @favorite_translation.destroy 
    respond_to do |format| 
     format.html { redirect_to favorite_translations_url, notice: 'Translation was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
end 


private 
def set_favorite_translation 
    @favorite_translation = FavoriteTranslation.find(params[:id]) 
end 
+1

Verwenden Sie 'has_one' Relation und anschließend' update' den Datensatz – Nithin

+0

Sie können 'FavoriteTranslation.where (id: params [: id]). First_or_initialize' ... Aber ich persönlich glaube Validierungen sollten auf Modellebene sein. Definieren Sie eine Beziehung wie von @Nithin angegeben und verwenden Sie validate_uniqueness_of validation in model. Verwenden Sie in der Steuerung nur first_or_initialize ... –

+0

Ist @current_user ein TranslationUser oder haben Sie auch ein Benutzermodell? – stef

Antwort

0

Ich denke, Sie sind fast da. Fügen Sie einfach Folgendes in die Methode destroy ein.

def destroy 
    if @favorite_translation 
     @favorite_translation.destroy 
    end 
    respond_to do |format| 
     format.html { redirect_to favorite_translations_url, notice: 'Translation was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
end 

Diese im Grunde überprüft, ob die favorite_translation vorhanden ist, sonst die translationUser keine favorite_translation haben und so wird es der neue Datensatz erstellt werden.

0

Wenn Sie keine Validierungen wollen, keine Sorgen, wird das Schreiben von richtigen Assoziationen Ihnen helfen und DRY Ihren Code auch.

Zuerst benutzen has_one :favorite_translation und belongs_to :translations_user Verbände, dann in Ihnen create Aktion ..

def create 

    transUser = TranslationsUser.find(favorite_translation_params[:translations_user_id]) 

    @favTrans = transUser.favorite_translation || transUser.build_favorite_translation 

    @favTrans.assign_attributes(favorite_translation_params) 

    respond_to do |format| 
    if @favTrans.save 
     format.html { redirect_to @favTrans, notice: 'Translations users comment was successfully created.' } 
     format.json { head :no_content } 
    else 
     format.html { render :new } 
     format.json { render json: @favTrans.errors, status: :unprocessable_entity } 
    end 
    end 
end 

Jetzt brauchen Sie nicht destroy Aufzeichnungen und has_many Beziehungen verwenden, erstellen und zu aktualisieren sind hier irgendwie verschmolzen.

0

Ich versuchte die gegebenen Lösungen, aber ich fand, dass das Folgende funktionierte. Danke für die Hilfe !!!!

def create 
    transUser = TranslationsUser.find(favorite_translation_params[:translations_user_id]) 

    if validate_uniqueness(transUser) == true 
     @favorite_translation = FavoriteTranslation.new(favorite_translation_params) 
     @favorite_translation.user_id = @current_user.id 
    else 
     update 
    end 

    respond_to do |format| 
    if @favorite_translation.save 
     format.json { head :no_content } 
    else 
     format.html { render :new } 
     format.json { render json: @favTrans.errors, status: :unprocessable_entity } 
    end 
    end 
end 


def update 
    transUser = TranslationsUser.find(favorite_translation_params[:translations_user_id]) 
    @favorite_translation = FavoriteTranslation.joins(:translations_user).where('lang_id = ?', transUser.lang_id).where('favorite_translations.user_id = ?', @current_user.id).where('translations_users.translation_id = ?', transUser.translation_id).first 
    @favorite_translation.translations_user_id = favorite_translation_params[:translations_user_id] 
    @favorite_translation.save 

    respond_to do |format| 
     if @favorite_translation.update(favorite_translation_params) 
     'Translations users comment was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render :edit } 
     format.json { render json: @favorite_translation.errors, status: :unprocessable_entity } 
     end 
    end 
end 
0

Ich entfernte diese Linie

config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs) 

von application.rb das Problem zu beheben.

Verwandte Themen