Gravatar - nil的未定义方法'email':NilClass

时间:2013-03-18 18:56:08

标签: ruby-on-rails email controller dashboard gravatar

我已经设置了gravatar并让它为我的'users/*user id goes here*'.工作 但每当我尝试在dashboard/index中使用它时,只要它给我错误

Undefined method 'email' for nil:NilClass

我的仪表板控制器是:

class DashboardController < ApplicationController

  def index

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @posts }
    end
  end

end

仪表板视图:

<div class="dash-well">
    <div class="gravatar-dashboard">
        <%= image_tag avatar_url(@user), :class => 'gravatar' %>
        <h1 class="nuvo wtxt"><%= current_user.username.capitalize %></h1>
    </div>
</div>

我的申请助手:

module ApplicationHelper
    def avatar_url(user)
         default_url = "#{root_url}images/guest.png"
         gravatar_id = Digest::MD5.hexdigest(user.email.downcase)
        "http://gravatar.com/avatar/#{gravatar_id}.png?s=200{CGI.escape(default_url)}"
    end

    def avatar_url_small(user)
         default_url = "#{root_url}images/guest.png"
         gravatar_id = Digest::MD5.hexdigest(user.email.downcase)
        "http://gravatar.com/avatar/#{gravatar_id}.png?s=40{CGI.escape(default_url)}"
    end
end

我的用户模型:

class User < ActiveRecord::Base

  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me, :username, :user_id, :id, :website, :bio, :skype, :dob, :age

  has_many :posts
  # attr_accessible :title, :body
end

我的仪表板型号:

class Dashboard < ActiveRecord::Base
  attr_accessible :status, :author, :email, :username, :id, :user_id, :user, :website, :bio, :skype, :dob, :age

  belongs_to :user
end

对不起,我是Ruby-On-Rails的新手!

2 个答案:

答案 0 :(得分:2)

试试这个:

<%= image_tag avatar_url(current_user), :class => 'gravatar' %>

答案 1 :(得分:1)

你真的想在你的控制器中使用它:

def index
  @user = current_user
  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @posts }
  end
end

注意添加第二行,它将@user变量分配给current_user。

然后,您在视图中调用的@user将起作用。当您继续使用它时,您将看到的典型轨道模式是,以@符号开头的大多数变量将在该视图的相应控制器方法中定义。因此,如果您使用带@的变量,并且它不可用,请检查控制器以确保首先定义它。 (仅供参考,如果您想了解更多,这些被称为实例变量)。

要解决第二个问题,如果您是current_user并且想要访问其他用户的页面:

def show
  @user = User.find params[:id]
  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @user }
  end
end

这适用于像/ users / 1这样的网址,您可以使用与avatar_url完全相同的调用,传递@user,它将获得该用户的头像,其中用户是与给定用户ID匹配的用户ID 。您可能已经在控制器中已经有了这个确切的代码,但希望现在您能看到它的工作原理。

祝你好运!