我有一个非常简单的用户模型。当我第一次创建它时,它有三个字段email
,password_hash
和password_salt
。
我最近在该模型中添加了一个字段,以便允许用户设置显示名称,该字段名为display
。我使用了this answer中概述的方法。所以我输入终端的内容如下:
script/rails g migration add_display_to_users display:string
然后
rake db:migrate
这很好用,在修改我的注册表单后,我能够将这些数据添加到数据库中。
在我的应用程序布局中,我想在标题中显示用户的显示名称。因此,在我的应用程序控制器中,我在每个控制器中调用一个方法来获取导航栏,称为nav_bar
。在这个方法中,我还设置了@user
实例变量,如果他们已登录。
因为在应用程序控制器中调用了nav_bar
方法,所以我可以从应用程序布局中访问它。所以,我试图在标题中显示他们的电子邮件作为测试,如下所示:
<% if @user %>
<div class="ac_button">
<%= @user.email %>
</div>
<% end %>
这很好用,并在标题中显示他们的电子邮件。但是,如果我将其更改为
<%= @user.display %>
它不会显示任何内容。
最奇怪的部分是,如果我在应用程序控制器或布局中的某处调用@user.email
或用户的任何其他属性。它工作,并显示其显示名称。我不知道为什么会让它发挥作用,但确实如此。
例如,如果在应用程序控制器中找到用户后,我调用@user.email
,它将在布局中显示其显示名称。
def nav_bar
if session[:user_id]
@user = User.find(session[:user_id])
@user.email
end
# create and return the navbar
end
或者,如果在布局中,我在任何地方调用用户的属性,它也可以。
<div class="ac_button">
<% @user.password_hash %>
<%= @user.display %>
</div>
如果有人能解释这种非常奇怪的行为,我会感到惊讶!
答案 0 :(得分:5)
名称display
是来自ActiveRecord::Base
的继承方法,因此当您创建名为display
的列时,会创建方法display
和display=
。因此,您通过创建列display
来过度使用ActiveRecord方法。之前有这个问题,...将列重命名为display_name
,一切都很好! ;)