Rails: доступ к данным другой таблицы SQL в представлении

#sql #database #ruby-on-rails-3 #model-view-controller

#sql #База данных #ruby-on-rails-3 #модель-представление-контроллер

Вопрос:

Я не понимаю, как получить доступ к данным из моего представления в другой таблице.

У меня несколько моделей. Первый — User, второй — UsersPreferences. Итак, у меня есть страница настроек для пользователей, и код выглядит так:

 <%= render 'shared/error_messages', :object => f.object %>
<div class="field">
  <%= f.label        :name %><br />
  <%= f.text_field   :name %>
</div>
...
<div class="checkbox">
  <%= f.check_box :notification_about_new_followers %>                        
  <%= f.label     'Notify via email about new followers' %><br />
</div>
  

Этот код работает (пользователь имеет строку notification_about_new_followers), но я хочу его изменить. Я решил, что лучший способ сохранить настройки в другой таблице. Итак, я создал модель UsersPreferences, которая имеет user_id и флаг ‘notify_about_new_followers‘. Я попытался переписать свое представление таким образом:

 <%= render 'shared/error_messages', :object => f.object %>
<div class="field">
  <%= f.label        :name %><br />
  <%= f.text_field   :name %>
</div>
...
<div class="checkbox">
  <%= f.check_box UsersPreferences.find_by_user_id(@user.id).notify_about_new_followers %>                        
  <%= f.label     'Notify via email about new followers' %><br />
</div>
  

Но когда я захожу на страницу с кодом, я получаю такую ошибку

 undefined method `true' for #<User:0x007f8ac180dee8>
  

Как я могу решить эту ошибку?

Пользовательская модель:

 class User < ActiveRecord::Base
  attr_accessible :name, ... , :notification_about_new_followers
  ...
  has_one  :users_preferences
end
  

Модель пользовательских предпочтений:

 class UsersPreferences < ActiveRecord::Base
  belongs_to :user, :class_name => "User"
  attr_accessible :notify_about_new_followers
end
  

Комментарии:

1. Пожалуйста, по- настоящему ознакомьтесь с MVC , прежде чем приобретать некоторые вредные привычки.

Ответ №1:

Эта строка:

 <%= f.check_box UsersPreferences.find_by_user_id(@user.id).notify_about_new_followers %>
  

вызывает ошибку. UsersPreferences.find_by_user_id(@user.id).notify_about_new_followers true по сути, эта строка читается:

 <%= f.check_box true %>
  

И, как указано в ошибке, для вашей модели пользовательских ссылок нет атрибута ‘true’.

Чтобы исправить это, вам нужно сначала ознакомиться с MVC (Model-View-Controller). Не зная, как работает MVC, вы никогда не сможете продвигаться вперед с Rails. Существует множество отличных ресурсов, просто Google «Model View Controller для rails». Вот хороший вариант. Немного глупо, хотя … если это не ваш стиль, попробуйте другую ссылку.

После того, как вы это узнаете, найдите помощник rails fields_for , и там вы найдете свой ответ.