首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NoMethodError in Users#unsubscribe

NoMethodError in Users#unsubscribe
EN

Stack Overflow用户
提问于 2016-11-15 16:22:22
回答 2查看 227关注 0票数 0

我正在努力实现我的rails邮件的取消订阅链接。不幸的是,我的代码中断如下:

NoMethodError in Users#unsubscribe -用于nil:NilClass的未定义方法`unsubscribe_hash‘

指向/app/view/user/un下标.html.erb行#3

代码语言:javascript
复制
<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如下所示

代码语言:javascript
复制
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

代码语言:javascript
复制
  resources :users, only: [:new, :create]
  get 'users/:unsubscribe_hash/unsubscribe' => 'users#unsubscribe', as: :unsubscribe
  patch 'users/update'

user.rb

代码语言:javascript
复制
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

通知取消订阅操作的电子邮件中的取消订阅链接

代码语言:javascript
复制
# app/views/job_notifier/send_post_email.html.erb
...
<%= link_to "Unsubscribe", unsubscribe_url(id: @unsubscribe) %>.

误差图解视图

似乎我遗漏了什么,我需要在我的users_controller中定义什么吗?在我的生活中,我从来没有能够解决NoMethodError,或者我不明白这到底是怎么回事。

EN

回答 2

Stack Overflow用户

发布于 2016-11-15 17:03:53

您会得到这个错误,因为@user (设置为UsersController#unsubscribe)是nil。这就是undefined methodunsubscribe_hash中的"for nil:NilClass“指的是nil:NilClass。

这种方法似乎不正确:

代码语言:javascript
复制
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

我相信像这样的事情更符合我的意图:

代码语言:javascript
复制
def unsubscribe
  @user = User.find_by_unsubscribe_hash(params[:unsubscribe_hash])
end
票数 1
EN

Stack Overflow用户

发布于 2016-11-15 17:14:38

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

代码语言:javascript
复制
undefined method 'method_name' for nil:NilClass

你被告知你正在试图调用一个零对象上的某个东西,所以你的注意力应该集中在为什么那个对象为零。您还会在日志中被告知错误发生的位置--在您的示例中,它指的是行,它在表单声明中引用了@user中的@user.unsubscribe_hash

所以@user是零,在本例中是零,因为负责呈现表单的控制器没有设置@user

代码语言:javascript
复制
user = User.find_by_unsubscribe_hash(params[:unsubscribe_hash])
@user = User.find_by_unsubscribe_hash(user)

现在,您正试图找到用户,然后将该用户传递到第二行以查找@user的原因已经超出了我的范围,但无论如何,真正的问题是您没有与params[:unsubscribe_hash]匹配的用户。

所以这个问题与调用你的取消订阅操作有关.你忘了把它加到你的问题上,所以我无法控制它,但那是你的焦点所在。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40614820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档