Rails/RoR - NoMethodError(undefined方法`destroy'为零:NilClass)

问题描述:

我有一个TranslationsUser表和FavoriteTranslation表。我想要一个TranslationsUser只有一个最喜欢的翻译,但是我不想使用验证,因为我希望我的控制器可以替换最喜欢的翻译(如果已经存在的话)。相反,我创建了一个validate_uniqueness函数。Rails/RoR - NoMethodError(undefined方法`destroy'为零:NilClass)

当我试着使用新宠翻译更换TranslationsUser,我得到我的终端以下错误: NoMethodError (undefined method `destroy' for nil:NilClass):

我想问题可能是before action :set_favorite_translation,因为它定义@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 
+1

使用'has_one'关系并随后更新记录 – Nithin

+0

您可以使用'FavoriteTranslation.where(id:params [:id])。first_or_initialize' ...但我个人认为验证应该在模型级别。定义@Nithin引用的关系,并在模型中使用validate_uniqueness_of验证。在控制器中,只需使用first_or_initialize ... –

+0

@current_user是一个TranslationUser还是您也有用户模型? – stef

我猜你是几乎没有。只需在destroy方法中添加以下内容即可。

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 

这基本上检查,如果favorite_translation存在,否则translationUser没有favorite_translation,因此将允许创建的新纪录。

如果你不想验证,不用担心,编写正确的关联会帮助你和你的代码。

首先,使用has_one :favorite_translationbelongs_to :translations_user协会,然后在你create行动..

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 

现在你不需要destroy记录和使用has_many关系,创建和更新都还挺合并在这里。

我试过了给定的解决方案,但是我发现下面的工作。感谢所有的帮助!

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 

我删除了这条线

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

application.rb来解决问题。