我正在努力实现我的rails邮件的取消订阅链接。不幸的是,我的代码中断如下:
NoMethodError in Users#unsubscribe -用于nil:NilClass的未定义方法`unsubscribe_hash‘
指向/app/view/user/un下标.html.erb行#3
<h4>Unsubscribe from Mysite Emails</h4>
<p>By unsubscribing, you will no longer receive email...</p>
<%= simple_form_for(@user, unsubscribe_path(id: @user.unsubscribe_hash)) do |f| %>
<%= f.hidden_field(:subscription, value: false) %>
<%= f.submit 'Unsubscribe' %>
<%= link_to 'Cancel', root_url %>
<% end %>我的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
endRoute.rb
resources :users, only: [:new, :create]
get 'users/:unsubscribe_hash/unsubscribe' => 'users#unsubscribe', as: :unsubscribe
patch 'users/update'user.rb
class User < ActiveRecord::Base
before_create :add_unsubscribe_hash, :add_true_to_users_table
validates :email, :uniqueness => 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
...
<%= link_to "Unsubscribe", unsubscribe_url(id: @unsubscribe) %>.误差图解视图

似乎我遗漏了什么,我需要在我的users_controller中定义什么吗?在我的生活中,我从来没有能够解决NoMethodError,或者我不明白这到底是怎么回事。
发布于 2016-11-15 17:03:53
您会得到这个错误,因为@user (设置为UsersController#unsubscribe)是nil。这就是undefined methodunsubscribe_hash中的"for nil:NilClass“指的是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发布于 2016-11-15 17:14:38
每当您看到任何格式为ruby的错误消息时:
undefined method 'method_name' for nil:NilClass你被告知你正在试图调用一个零对象上的某个东西,所以你的注意力应该集中在为什么那个对象为零。您还会在日志中被告知错误发生的位置--在您的示例中,它指的是行,它在表单声明中引用了@user中的@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]匹配的用户。
所以这个问题与调用你的取消订阅操作有关.你忘了把它加到你的问题上,所以我无法控制它,但那是你的焦点所在。
https://stackoverflow.com/questions/40614820
复制相似问题