我正在建立一个社交网站(基本上是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)更改帖子模型,以便帖子有“用户”和“联系人”?
谢谢你们 斯特凡诺
答案 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