undefined局部变量或方法`first_name'

时间:2014-02-03 23:07:19

标签: ruby-on-rails ruby devise

我正在尝试通过视图模板显示用户的全名。

 <%= @status.user.full_name %>

上面的代码将给出未定义的局部变量或方法`first_name'。 我通过设计gem生成的user.rb模型设置了这样的“full_name”方法。

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :email, :password, :password_confirmation, :remember_me, :first_name,
                        :last_name, :profile_name

  has_many :statuses

  def full_name
    first_name + " " + last_name
  end
end

最后,first_name和last_name是通过设计迁移文件定义的。

class DeviseCreateUsers < ActiveRecord::Migration
  def change
    create_table(:users) do |t|
      t.string :first_name
      t.string :last_name
      t.string :profile_name

我的猜测是attr_accessible会导致设计错误。需要你的帮助! 谢谢!

1 个答案:

答案 0 :(得分:0)

使用self引用访问它们的first_namelast_name实例:

def full_name
  self.first_name + " " + self.last_name
end

更新:

感谢OP接受答案,并感谢@JörgWMittag指出这个答案是如何误导的,因为问题是关于Rails 4,最初建议的答案是假设Rails 3。

此特定问题的解决方案是从模型中完全删除attr_accessible声明并使用强参数。我认为,将此答案改为“接受的答案”的建议链接是Adding custom fields to your Devise User model in Rails

再次感谢@JörgWMittag指出在原始答案中误用了self。上述self方法中的first_namelast_name不需要full_name。如果这个方法是getter或setter,那么使用self关键字就必须暗示我们想要操作实例的属性而不是函数中的局部变量。

StackOverflow中有关于此主题的资源似乎很多,但这里有一个明确区分的公认答案:When to use 'self' in Ruby