我正在尝试通过视图模板显示用户的全名。
<%= @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会导致设计错误。需要你的帮助! 谢谢!
答案 0 :(得分:0)
使用self
引用访问它们的first_name
和last_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_name
和last_name
不需要full_name
。如果这个方法是getter或setter,那么使用self
关键字就必须暗示我们想要操作实例的属性而不是函数中的局部变量。
StackOverflow中有关于此主题的资源似乎很多,但这里有一个明确区分的公认答案:When to use 'self' in Ruby