用户中的NoMethodError#unsubscribe

我正在努力实现我的rails邮件的取消订阅链接。 不幸的是,我的代码打破了这个:

用户中的NoMethodError#unsubscribe – nil的未定义方法`unsubscribe_hash’:NilClass

它指向/app/views/users/unsubscribe.html.erb第3行

Unsubscribe from Mysite Emails

By unsubscribing, you will no longer receive email...

我的user_controller如下所示

 class UsersController < ApplicationController protect_from_forgery def new @user = User.new end def create @user = User.new(secure_params) if @user.save flash[:notice] = "Thanks! You have subscribed #{@user.email} for Jobs Alert." else flash[:notice] = 'Error Subscribing! Kindly check your email and try again.' end redirect_to root_path end def unsubscribe user = User.find_by_unsubscribe_hash(params[:unsubscribe_hash]) @user = User.find_by_unsubscribe_hash(user) end def update @user = User.find(params[:id]) if @user.update(secure_params) flash[:notice] = 'Subscription Cancelled' redirect_to root_url else flash[:alert] = 'There was a problem' render :unsubscribe end end private def secure_params params.require(:user).permit(:email, :subscription) end end 

Route.rb

  resources :users, only: [:new, :create] get 'users/:unsubscribe_hash/unsubscribe' => 'users#unsubscribe', as: :unsubscribe patch 'users/update' 

user.rb

 class User  true validates_presence_of :email validates_format_of :email, :with => /\A[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}\z/i private def add_unsubscribe_hash self.unsubscribe_hash = SecureRandom.hex end def add_true_to_users_table self.subscription = true end end 

取消订阅电子邮件中的链接,该链接称为取消订阅操作

 # app/views/job_notifier/send_post_email.html.erb ... . 

错误的图解视图

在此处输入图像描述

看来我错过了什么,我需要在users_controller中定义一些东西吗? 我生命中从来没有能够解决NoMethodError或者我不明白它是什么。

您收到该错误是因为@user (在UsersController#unsubscribe设置)为nil 。 这就是nil:NilClass`中undefined method unsubscribe_hash’中的“for nil:NilClass”所指的内容。

这种方法似乎不正确:

 def unsubscribe user = User.find_by_unsubscribe_hash(params[:unsubscribe_hash]) @user = User.find_by_unsubscribe_hash(user) end 

您正在通过unsubscribe_hash查找用户并将其分配给user ,然后再次通过unsubscribe_hash查找用户,但将user作为值传递给find_by_unsubscribe_hash

我相信这样的事情更像是有意的:

 def unsubscribe @user = User.find_by_unsubscribe_hash(params[:unsubscribe_hash]) end 

每当您在格式的ruby中看到任何错误消息时:

 undefined method 'method_name' for nil:NilClass 

你被告知你试图在零物体上调用某些东西,所以你应该关注的焦点是为什么这个物体为零。 您还会在日志中告知错误发生的位置 – 在您的情况下,它引用了行,该行引用了表单声明中@user.unsubscribe_hash中的@user.unsubscribe_hash

所以@user是零,在这种情况下它是零,因为负责呈现表单的控制器没有设置@user

 user = User.find_by_unsubscribe_hash(params[:unsubscribe_hash]) @user = User.find_by_unsubscribe_hash(user) 

现在为什么你试图找到用户,然后将该用户传递到第二行以找到@user超出我的原因,但无论如何真正的问题是你没有匹配params[:unsubscribe_hash]用户params[:unsubscribe_hash]

因此,问题与调用取消订阅操作的任何内容有关…您忽略了将其添加到您的问题中,因此我无法帮助您,但这是您的重点开始的地方。