未定义的辅助方法

时间:2011-09-17 02:36:54

标签: ruby-on-rails helper

我有一个问题:

undefined method `avatar_url' for #<User:0x000000040783a8>

控制器:

class ApplicationController < ActionController::Base
  protect_from_forgery
  helper :all
  helper_method :avatar_url

  protected

  def avatar_url(user)
    if user.avatar_url.present?
      user.avatar_url
    else
      default_url = "#{root_url}images/guest.png"
      gravatar_id = Digest::MD5.hexdigest(user.email.downcase)
      "http://gravatar.com/avatar/#{gravatar_id}.png?s=48&d=#{CGI.escape(default_url)}"
    end
  end
end

在视图中:

...
<%for user in @users %>
  <%= image_tag avatar_url(user) %>, username: <%= user.username %>, e-mail: <%= user.email %>
<% end %>
...

有人帮助我吗?

2 个答案:

答案 0 :(得分:5)

密钥是错误消息:

undefined method `avatar_url' for #<User:0x000000040783a8>

错误不是因为辅助方法未定义:错误消息表明它是User类中缺少的方法。 ApplicationController中定义的方法尝试:

def avatar_url(user)
  if user.avatar_url.present?
    user.avatar_url
  #...

您需要确保User类具有avatar_url实例方法。

答案 1 :(得分:-1)

最好从文件ApplicationController中删除“helper_method:avatar_url”行。
请在此处查看更多详情。 "undefined method" when calling helper method from controller in Rails

因为,您应该在任何其他模块/帮助文件中定义辅助方法xxx(helper_method:xxx)。因此,行助手:所有自动包含所有助手文件,然后只能使用行helper_method:xxx。这很有道理。

无需将ApplicationController方法定义为辅助方法。您可以在任何控制器或视图中调用这些方法,只需使用avatar_url()。