2010-09-17 3 views
0

Я работаю на сайте социальной сети (в основном, копию фейсбука, если честно ...), и я повторно использовал большие части insoshi. Но корма insoshi недостаточно точна для моих предпочтений. Так как в нем нет более специализированных сообщений. Вы увидите, что я имею в виду в следующем коде:рельсы проверяют наличие существующего атрибута экземпляра

item = activity.item 
relationship = relationship(item) 
case relationship 
    when 1 
    raw %(<p>You wrote on your own wall: <br/> 
    #{truncate(item.body, :length => 20)}</p>) 
    when 2 
    raw %(<p>#{link_to item.user.name, item.user} wrote on your wall</p>) 
    when 3 
    raw %(<p>#{link_to item.user.name, item.user} wrote on his wall</p>) 
    when 4 
    raw %(<p>You wrote on #{link_to item.user.name, item.user}'s wall</p>) 
    when 5 
    raw %(<p>#{link_to item.user.name, item.user} wrote on 
       #{link_to item.contact.name, item.contact}'s wall</p>) 
end 

    def relationship(item) 
     unless item.owner.nil? 
      contact = item.owner #so that it works for posts as well 
     else 
      contact = item.contact 
     end 
     user = item.user 

     if current_user != contact or current_user != user 
      return 5 
     else 
      if current_user == contact 
      if current_user == user 
       return 1 
      else 
       return 2 
      end 
      else 
      if contact == user 
       return 3 
      else 
       return 4 
      end 
      end 
     end 
end 

У меня есть различные типы элементов. Обычно элементы имеют «пользователь» и «контакт». За исключением сообщений, у них есть «пользователь» и «владелец». Потому что другой пост может записать его на чью-то стену (поэтому хозяин).

Теперь проблема возникает, как только я пытаюсь установить контакт с item.contact ... он просто держит меня с ошибкой «NoMethod», говоря, что item.contact не существует. (что очевидно, если элемент является сообщением, а не «соединением» или сопоставимым).

Поэтому я прошу ваше мнение: 1) Исправлена ​​проблема с некоторыми более рубин, или 2) изменить пост модель, так что пост имеет «пользователь» и «контакт»?

Спасибо, ребята Стефано

+0

Uargh. Пожалуйста, используйте Символы вместо целых. – Reactormonk

+1

Ненавижу быть членом, но этот код действительно сложно понять и выглядит очень хаки. Я бы определенно не исправил проблему, добавив к этому код. Я бы порекомендовал читать на однонамерном наследовании, полиморфизме и подумал о том, чтобы переместить 'отношение' в модель. –

+0

сделать новую модель, включая таблицу, исключительно с целью настройки вывода помощника? @Tass: символы бы не стали более запутанными? : user_same_as_contact,: current_user_same_as_user Я не уверен, что понимаю, что вы имеете в виду. – KimJongIl

ответ

0

Согласно вашей логике, отношения 3 и 4 никогда не будут возвращены. Я думаю, где у вас есть current_user != contact or current_user != user, вы должны иметь and. Лично я всегда использую & &, потому что это короткие замыкания, если первое условие ложно. Однако в моем рефакторе вам это не нужно, потому что он возвращает 5, если нет других случаев.

Я переместил логику отношений к модели Item и сделал соответствующие обновления в помощнике.

View Helper:

case item.relationship_to_user(current_user) 
when 1 
    raw %(<p>You wrote on your own wall: <br/> 
    #{truncate(item.body, :length => 20)}</p>) 
when 2 
    raw %(<p>#{link_to item.user.name, item.user} wrote on your wall</p>) 
when 3 
    raw %(<p>#{link_to item.user.name, item.user} wrote on his wall</p>) 
when 4 
    raw %(<p>You wrote on #{link_to item.user.name, item.user}'s wall</p>) 
when 5 
    raw %(<p>#{link_to item.user.name, item.user} wrote on 
    #{link_to item.contact.name, item.contact}'s wall</p>) 
end 

Пункт Класс

class Item < ActiveRecord::Base 

    def relationship_to_user(current_user) 
    contact = owner || contact 

    return 1 if current_user == contact && current_user == user 
    return 2 if current_user == contact 
    return 3 if current_user != contact 
    return 4 if current_user != contact && contact != user 

    return 5 
    # return 5 if current_user != contact or current_user != user 
    end 

end 
+0

спасибо, очень признателен. но кажется, что целые ключи - это путь (?) – KimJongIl

+1

Вы можете легко улучшить его, используя константы или символы. 'Отношения :: ДРУЗЬЯ или': друзья' – glebm

0

Я бы исправить с Руби кодом.

contact = item.contact if item.respond_to? :contact

Используя respond_to? это будет работать для любого класса, у которого есть контакт.

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