Rails - странное поведение после добавления поля в модель - PullRequest
3 голосов
/ 18 ноября 2011

У меня очень простая пользовательская модель.Когда я впервые его создал, в нем было три поля email, password_hash и password_salt.

. Я недавно добавил поле к этой модели, чтобы пользователь мог задать отображаемое имя,поле называется display.Я использовал метод, описанный в этом ответе .То, что я набрал в терминале, выглядело бы так:

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>

Если кто-нибудь может объяснить это очень странное поведение, я будупоражаюсь!

1 Ответ

5 голосов
/ 18 ноября 2011

Имя display является унаследованным методом от ActiveRecord::Base, поэтому при создании столбца с именем display создаются методы display и display=.Таким образом, вы переопределяете метод ActiveRecord, создавая столбец display.Если раньше эта проблема была ... переименовал столбец в display_name и все было хорошо!;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...