Ruby on rails 如何在RubyonRails中创建facebook风格的新闻提要?
我正在尝试将对象融合到单个流中 我创建了一个名为Newsfeed的新模型和控制器。我有它,所以新闻提要有很多:消息,有很多:图像,图像和消息属于:新闻提要。我正在设置控制器,我有:Ruby on rails 如何在RubyonRails中创建facebook风格的新闻提要?,ruby-on-rails,Ruby On Rails,我正在尝试将对象融合到单个流中 我创建了一个名为Newsfeed的新模型和控制器。我有它,所以新闻提要有很多:消息,有很多:图像,图像和消息属于:新闻提要。我正在设置控制器,我有: def index @messages = Messages.all @images = Images.all @feed = ? end 当每一个都需要单独的格式化时,我如何融合它们以便它可以从两者中提取并按时间顺序排列它们 非常感谢您提供的任何帮助。这感觉像是一个有点繁重的问题,虽然我没
def index
@messages = Messages.all
@images = Images.all
@feed = ?
end
当每一个都需要单独的格式化时,我如何融合它们以便它可以从两者中提取并按时间顺序排列它们
非常感谢您提供的任何帮助。这感觉像是一个有点繁重的问题,虽然我没有时间详细探讨,但这里有一些初步想法供您参考:
if item.is_a? Message
render :partial => 'message', :locals => {:message => item }
elsif item.is_a? Image
render :partial => 'image', :locals => {:image => item }
end
希望这能帮助一些人
编辑:要组合数组,只需使用“+”操作符将它们附加在一起,因为Ruby中的数组不需要包含单个对象类型
您的Messages.all和Images.all调用将为您提供对象数组,因此请尝试
@messages + @images
你应该有你的组合数组
编辑#2:如果我自己写这篇文章,我可能会这样处理视图:
<%= display_item(item) %>
在顶层,只需将提要集合传递给一个分部,该分部用于呈现单个项:
render :partial => "item", :collection => @feed
这将为@feed中的每个项目呈现部分“_item.html.erb”。此外,每次它都会给部分变量一个名为“item”的局部变量,这是@feed中针对特定迭代的项
现在,我可能会让“_item”部分非常简单,如下所示:
<%= display_item(item) %>
其中,display_item是视图之外的一个助手方法,并使用上面的“is_a?”类型逻辑来实现,以为该项选择正确的显示格式
我之所以这样分解它,是因为它利用了一些很好的rails特性(将集合传递给一个分部,而不是自己在集合上循环),然后将逻辑拉到helpers(或者甚至模型,如果有意义的话)中是有用的,因为它简化了您的视图。尽可能将逻辑排除在视图之外通常是一种很好的做法,因为这样的逻辑可能很难测试,并且您的视图将变得很难阅读。您可以采取以下措施: 控制器:
def index
messages = Messages.all
images = Images.all
@feed = (messages + images).order_by(&:created_at)
end
查看index.html.erb:
<%= render @feed %>
<% if feed.is_a? Message %>
<%= render "message", :locals => {:message => feed}%>
<% else %>
<%= render "image", :locals => {:image => feed}%>
<% end %>
查看_feed.html.erb:
<%= render @feed %>
<% if feed.is_a? Message %>
<%= render "message", :locals => {:message => feed}%>
<% else %>
<%= render "image", :locals => {:image => feed}%>
<% end %>
{:message=>feed}%>
{:image=>feed}%>
并添加两个部分_message.html.erb和_image.html.erb我确信这可以从它的贫民区多态性中简化,但它对我有效,我也曾为“如何组合所有这些模型结果?!” 我使用一个单独的模型,比如你和一个观察者:
class NewsfeedObserver < ActiveRecord::Observer
observe Message, Image
def after_save(object)
@item = Newsfeed.create(
:item_id => object.id,
:item_type => object.class.to_s
)
end
end
然后只需拉动它们,并在您的视图中以您喜欢的方式显示
#Controller
def index
@feed = Newsfeed.get_items
end
接下来,我可能会开始在流跟踪模型中添加更多内容,以保存其他表的点击量,但希望您能理解。感谢您的回复,我如何将它们组合到控制器中的单个数组中?关于partials的好主意,我忘了。你为什么认为这是一个充满负担的问题?我是一个rails迷。乍一看,要得到这个问题的可靠答案,似乎需要很多细节,但希望这些想法是有用的。我更新了关于如何将数组附加在一起的答案。嘿,皮特,很抱歉我问了这么多问题,但是除了助手,我已经准备好了所有的代码。我如何定义item.is_a?消息再次感谢。我是否在视图中将其设置为:“message”,:locals=>{:messages=>@messages}%>“image”,:locals=>{:images=>@images}%>是否为?是Ruby中的一个内置方法,因此您不需要自己定义它。您可以看看:您最终选择的方向是什么?我还写了一篇文章,介绍如何以更优雅的方式在控制器/模型方面进行操作