2017-07-17 14 views
2

私は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 
+1

'has_one'の関係を使用してレコードを更新する – Nithin

+0

' FavoriteTranslation.where(id:params [:id])。first_or_initialize'を使うことができますが、私は個人的にはモデルレベルでの検証が必要です。 @Nithinによって引用された関係を定義し、モデルでvalidate_uniqueness_of検証を使用します。コントローラでは、first_or_initializeを使用してください。 –

+0

@current_userはTranslationUserですか、またはUserモデルもありますか? – stef

答えて

0

私はあなたが、ほとんどがあると思います。 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を持っていないので、新しいレコードを作成できるようになります他に、存在する場合、これは基本的にチェックします。

0

妥当性検査をしたくない場合は、心配する必要はありません。適切な関連付けを行うと、DRYも同様に役立ちます。まず

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関係を使用して、作成および更新しませんが、ちょっとここにマージされます。

0

私は与えられた解決策を試しましたが、私は次のことが働いたことがわかりました。すべての助けをありがとう!

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

私はこの問題を解決するためにapplication.rbからこのラインに

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

を削除しました。

関連する問題