rails检查现有实例属性

时间:2010-09-17 11:42:13

标签: ruby-on-rails methods not-exists

我正在建立一个社交网站(基本上是facebook的副本,老实说......)我重复使用了很多内容。但是,对于我的喜好来说,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)更改帖子模型,以便帖子有“用户”和“联系人”?

谢谢你们 斯特凡诺

2 个答案:

答案 0 :(得分:0)

我会修复Ruby代码。

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

使用respond_to?这适用于任何有联系的班级。

答案 1 :(得分:0)

根据你的逻辑,关系3和4永远不会被归还。我想你在哪里current_user != contact or current_user != user,你的意思是and。就个人而言,我总是使用&amp;&amp;因为如果第一个条件是假的,它会短路。但是,在我的重构中,您不需要它,因为如果没有其他情况匹配则返回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