【问题标题】:undefined local variable or method `first_name'未定义的局部变量或方法“first_name”
【发布时间】:2014-02-03 23:07:19
【问题描述】:

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

 <%= @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 会导致设计错误。需要你的帮助! 谢谢!

【问题讨论】:

  • 你的日志是怎么说的?
  • 确保 rake db:migrate 并重启服务器

标签: ruby-on-rails ruby devise


【解决方案1】:

使用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 的滥用。在上述full_name 方法中,first_namelast_name 不需要self。如果此方法是 getter 或 setter,则必须使用 self 关键字来暗示我们要对实例的属性而不是函数中的局部变量进行操作。

StackOverflow 中似乎有很多关于这个主题的资源,但这里有一个很好接受的答案,有明显的区别:When to use 'self' in Ruby

【讨论】:

  • 谢谢。但是错误仍然存​​在:(我无法弄清楚。
  • @HyunsooChoi,日志中有什么有用的信息吗?刚刚在Rails 3.2 + Devise 3.0 中测试了它,它按预期工作。
  • 是的,我真的认为这与 Rails 4.2 + devise 3.0 有关。我不认为它们完全兼容。让我检查一下日志。谢谢
  • 如果你在 Rails4 上,你不应该使用强参数而不是attr_accessible
  • self 在 Ruby 中始终是隐含的接收者,无需显式指定。如果问题中的代码不起作用,那么这个答案中的代码也可能不起作用。如果这个答案中的代码 does 有效,那么问题中的代码也应该如此。无论哪种方式,这个答案充其量都是误导性的。
猜你喜欢
  • 2017-01-26
  • 2018-04-19
  • 2015-01-01
  • 2013-12-17
  • 2016-04-29
  • 2018-04-21
相关资源
最近更新 更多