私はTranslationsUserテーブルとFavoriteTranslationテーブルを持っています。 TranslationsUserにはお気に入りの翻訳が1つしかないようにしたいと思いますが、既に存在する場合はお気に入りの翻訳を置き換えるコントローラが必要なので、検証を使用したくありません。代わりに、validate_uniqueness
関数を作成しました。Rails/RoR - NoMethodError(Nil:NilClassのための未定義メソッド `destroy ')
私は新しいお気に入りの翻訳をTranslationsUserを交換しようとすると、私は私の端末で次のエラーを取得する: NoMethodError (undefined method `destroy' for nil:NilClass):
私はそれが場合@favorite_translation
を定義しているので問題はbefore action :set_favorite_translation
かもしれないと思いますだから、特定のFavoriteTranslationレコードを削除するにはどうすればいいですか:transUser.favorite_translations.first
もし問題が解決しない場合は、どうすればいいですか?どうもありがとう。
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
'has_one'の関係を使用してレコードを更新する – Nithin
' FavoriteTranslation.where(id:params [:id])。first_or_initialize'を使うことができますが、私は個人的にはモデルレベルでの検証が必要です。 @Nithinによって引用された関係を定義し、モデルでvalidate_uniqueness_of検証を使用します。コントローラでは、first_or_initializeを使用してください。 –
@current_userはTranslationUserですか、またはUserモデルもありますか? – stef