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
Verwenden Sie 'has_one' Relation und anschließend' update' den Datensatz – Nithin
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 ... –
Ist @current_user ein TranslationUser oder haben Sie auch ein Benutzermodell? – stef