рельсы проверяют наличие атрибута экземпляра - PullRequest
0 голосов
/ 17 сентября 2010

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

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) изменить модель поста так, чтобы пост имел «пользователя» и «контакт»?

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

Ответы [ 2 ]

0 голосов
/ 18 сентября 2010

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

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

Помощник вида:

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 голосов
/ 17 сентября 2010

Я бы исправил с помощью кода Ruby.

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

С помощью response_to? это будет работать для любого класса, у которого есть контакт.

...