2013-03-01 78 views
0

想象一下,一个Rails项目根据它们的名字查找动物名称。该Rails应用程序由执行实际查找的外部服务提供支持。该服务基于密钥返回结果。例如,如果我向[GET]/animal?name = benji这样的外部API请求,我会返回类似{“type”:“dog”,“legs”:“4”,“tail-length “:”短“”领“:”蓝“}。然而,如果我传入...?name = flipper到动物终点,我会回到{“type”:“dolphin”,“color”:“gray”,“food”:“fish”}。 (数据以实际的JSON或XML格式返回,我只是在这里用伪代码来表达这一点)导轨和工厂模式

我的第一个问题是这个......鉴于返回调用的属性根据在将一个响应(由于缺少一个更好的术语)解组为一个“模型”对象时,是否传入,是否有意义地实现某种类型的工厂模式(由Russ Olsen的第13章的Ruby中的ala Design Patterns)来创建对象一个合适的班级?还有其他方法是否合理?

我的下一个问题是这样的,可以说我想显示一个网页上的所有动物列表(使用ERB模板)。是否有意义创建不同的部分模板(例如_dolphin.html.erb和_dog .html.erb),然后在主列表视图中放置一个案例,该列表视图可以将每个列表项目渲染为适当的模板。

例如:

list.html.erb ...

<ul> 
    <% for animal in @animals.each %> 
    <li> 
     <% if animal.type == 'dog' %> 
      <%= render :partial => 'dog', :locals => {:animal => animal} %> 
     <% elsif item.type == 'dolphin' %> 
      <%= render :partial => 'dolphin', :locals => {:animal => animal} %> 
     <% else %> 
      <%= render :partial => 'generic_animal', :locals => {:animal => animal} %> 
     <% end %> 
     </li>   
    <% end %> 
    </ul> 

(这里animal.type == '狗' 是故意的,我不使用符号(:狗),因为从API返回的数据是一个字符串值,它用于填充animal.type属性。Bad,我知道。)

我正在使用的项目现在正在使用此方法。 (显然,我已经改变了元素/域。)我想知道这是否是一种有效的方法,或者如果其他人已经处理了类似的问题以及他们如何去做。

谢谢!

回答

0

我想说创建一个单一的模型和单个视图,其中包含所有可能的属性(不能是无限数字;))。

然后你有一个

if attribute_x exists then 
    display it 
end 

if attribute_y exists then 
    display it 
end 

每个属性。

如果你为每只动物创建一个视图,这根本就不会干,因为你知道每只动物都有最喜欢的食物和颜色等,所以你会重复自己很多次。另一个原因:如果API改变了一点,并且动物收集或丢失了某个属性,则必须修改此更改。

只有一种观点,它会一直很好。

如果要超级确保您收集所有属性,可以在控制器中放置一个包含所有已知属性的数组,并且如果有某些未知事件:将其写入日志文件。


我只会选择'每个动物一个视图'的方式,如果你想能够显示一些动物完全不同的东西。但是你也可以告诉你的控制器它应该选择另一个视图,如果name = 'Donkey Kong'。你知道我的意思。

+0

谢谢,本杰明。在我的例子中,我正在使用动物。实际的应用程序可能更像是“动物”,而“realestate”是两个不同的返回对象,并且视图完全不同。感谢您的反馈! – 2013-03-01 18:07:02