Rails - 向模型添加字段后的奇怪行为

Ale*_*lan 3 activerecord model ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我有一个非常简单的用户模型.当我第一次创造了它,它有三个字段email,password_hashpassword_salt.

我最近在该模型中添加了一个字段,以便允许用户设置显示名称,即被调用的字段display.我使用了这个答案中概述的方法.所以我在终端输入的内容如下所示:

script/rails g migration add_display_to_users display:string
Run Code Online (Sandbox Code Playgroud)

然后

rake db:migrate
Run Code Online (Sandbox Code Playgroud)

这很好用,在修改我的注册表单后,我能够将这些数据添加到数据库中.

在我的应用程序布局中,我想在标题中显示用户的显示名称.所以,在我的应用程序控制器中,我在每个控制器中调用一个方法来获取被调用的导航栏nav_bar.在这个方法中,我还设置了一个@user实例变量,如果他们已登录.

因为nav_bar在应用程序控制器中调用了该 方法,所以我可以从应用程序布局中访问它.所以,我试图在标题中显示他们的电子邮件作为测试,如下所示:

<% if @user %>
    <div class="ac_button">
        <%= @user.email %>
    </div>
<% end %>
Run Code Online (Sandbox Code Playgroud)

这很好,并在标题中显示他们的电子邮件.但是,如果我将其更改为

 <%= @user.display %>
Run Code Online (Sandbox Code Playgroud)

它没有显示任何内容.

最奇怪的部分是,如果我@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
Run Code Online (Sandbox Code Playgroud)

或者,如果在布局中,我在任何地方调用用户的属性,它也可以.

<div class="ac_button">
    <% @user.password_hash %>
    <%= @user.display %>
</div>
Run Code Online (Sandbox Code Playgroud)

如果有人能解释这种非常奇怪的行为,我会感到惊讶!

dav*_*idb 5

该名称display是一个继承的方法,ActiveRecord::Base因此当您创建一个名为display方法的列displaydisplay=创建时.因此,您通过创建列来过度使用ActiveRecord方法display.之前有这个问题,...将列重命名为display_name,一切都很好!;)