2010-04-02 7 views
0

У меня есть модель User, модель Post и интересная модель.has_many сквозные и частичные


User has_many posts through interests 

User has_many interests 

Post has_many users through interests 

Post has_many interests 

Interest belongs to Post 

Interest belongs to User 

application_controller выглядит следующим образом:

class ApplicationController < ActionController::Base 
    before_filter :login_from_cookie 
    before_filter :find_user_interests 
    helper :all # include all helpers, all the time 
    session :session_key => '_blah_session' 

    include AuthenticatedSystem 

    def find_user_interests 
    @user_interests = current_user ? current_user.interests : [] 
    true 
    end 

end 

Application.html.erb имеет следующим образом:

<%= render :partial => "users/interests", :object => @user_interests %> 

_interests.html. Еврорадио парциальное выглядит следующим образом:

ul 
    <% unless current_user.nil? then -%> 
    <% @user_interests.each do |interest| -%> 
     li<%= interest.post.title %>/li 
    <% end %> 
    <% end -%> 
/ul  

Учитывая все это, когда я на локальном хосте: 3000/сообщений/1 мои частичные проявляющимся отлично, но когда в локальном хосте: 3000/сообщений я получаю ошибку undefined method 'title' for nil:NilClass, таким образом, ошибка в строке li<%= interest.post.title %>/li, указанная выше в части _interests.html.erb.

Что, черт возьми, будет проблемой?

ТИА

ответ

2

Это просто означает, что одна из интересов не имеет ассоциированное пост на другом конце. Скорее всего, он был удален. Этого можно было бы предотвратить:

class Post < ActiveRecord::Base 
    has_many :interests, :dependent => :destroy 
end 

Тем временем вы должны очистить сирот в базе данных.

Редактировать: Вы утверждаете, что это уже было в вашей модели, но если это было тогда, неясно, как вы могли бы иметь осиротевший интерес, как указывает ошибка. Может быть, он был создан до того, как вы добавили зависимую статью? Опять же, удалите сирот через SQL, а затем повторите попытку. Если проблема возникла позже, вы должны удалить ее без обратных вызовов.

Что касается проблемы с размером. Вы можете использовать current_user.interests.count. Это связано с некоторой магией с ассоциациями Rails. count - это специальный метод для ассоциации Rails, которая запускает SQL. length - это всего лишь метод массива, рассказывающий вам, сколько элементов находится в массиве. У ассоциаций Rails есть несколько специальных методов, но остальные из них прозрачно передаются в объект массива.

Другие критические замечания: при передаче :object => @user_interests вы задаете переменную с именем частичного. Таким образом, вы можете ссылаться на локальную переменную interests в частичном. Однако вы ссылаетесь на @user_interests, поэтому передача объекта не требуется. При прочих равных условиях передача объекта и использование локальной переменной, вероятно, лучше (это более явный, более функциональный стиль программирования), но в этом случае вы не используете это.

Наконец, в стиле, я могу ошибаться, так как у меня нет полного контекста, но в целом я бы поставил условие logged_in в шаблон, а не устанавливал user_interests в пустой массив, если пользователь не зарегистрирован. Это позволит вам ссылаться на current_user.interests.count в шаблоне и независимо устанавливать отображаемые интересы (например, для разбивки на страницы) в @user_interests.

+0

У меня есть, что покрыто моделью сообщений через has_many: interest,: dependent =>: destroy – jdog

+0

Также, что странно, если я извлечу код в частичном, чтобы разделить заголовок, чтобы обойти эту ошибку. У меня есть заголовок в частичном, который задан как «У вас есть @ user_interests.length интересы», и когда я нахожусь на странице сообщений и говорю, что на странице сообщений есть 10 сообщений, которые мой заголовок гласит: «У вас 10 интересов», поэтому его подсчет всех как интерес, даже если пользователь не выбрал эту должность в качестве интереса. – jdog

+0

И когда я перехожу на одну конкретную страницу с сообщениями, так что показывайте действие, на этой странице приведенный выше заголовок гласит: «У вас есть 1 интерес», поэтому он, кажется, подсчитывает количество сообщений на конкретных страницах (индекс или показ) и суммирует те, кто интересуется пользователями. – jdog

Смежные вопросы