用户#中的NoMethodError显示在rails项目中

时间:2016-04-18 23:25:21

标签: ruby-on-rails ruby

我一直在NoMethodError中获得Users#show

undefined method `downcase' for nil:NilClass

在尝试使用gravatar时,我不明白错误的确切位置。我发布了相关代码以帮助解决我的问题。有什么我想念的吗?

show.html.erb

<h1 align="center"> Welcome to <%= @user.username %>'s page</h1>
<div class="row">
    <div class="col-md-4 col-md-offset-4 center">
        <%= gravatar_for @user %>
    </div>
</div>
<h4 align="center"><%= @user.username %>'s articles</h4>

users_controller.rb

class UsersController < ApplicationController

  def new 
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
        flash[:success] = "Welcome to the alpha blog #{@user.username}"
        redirect_to articles_path
    else
        render 'new'
    end
  end

  def edit 
    @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])
    if @user.update(user_params)
      flash[:success] = "Your account was updated successfully"
      redirect_to articles_path
    else
      render 'edit'
    end
  end 

  def show
    @user = User.find(params[:id])
  end

  private

    def user_params
      params.require(:user).permit(:username, :email, :password)
    end
end

application_helper.rb

module ApplicationHelper
    def gravatar_for(user)
        gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
        gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}"
        image_tag(gravatar_url, alt: user.username, class: "img-circle")
    end
end

2 个答案:

答案 0 :(得分:2)

错误位于gravatar_for方法的第一行。 user.email为零,因此当您尝试在nil对象上调用downcase时会出现此错误。发生这种情况是因为用户没有电子邮件。

您应该在尝试获取其gravatar之前检查用户是否有电子邮件,或者通过对用户模型进行验证来确保每个用户都有电子邮件。

答案 1 :(得分:2)

我猜你在这一行上得到了错误:

gravatar_id = Digest::MD5::hexdigest(user.email.downcase)

这意味着user.email将返回nil