【问题标题】:Rails - Strange Behavior After Adding Field to ModelRails - 向模型添加字段后的奇怪行为
【发布时间】:2011-11-18 09:02:58
【问题描述】:

我有一个非常简单的用户模型。当我第一次创建它时,它有三个字段emailpassword_hashpassword_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>

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord model ruby-on-rails-3.1


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-08-12
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多