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