Ruby on rails 如何在RubyonRails中创建facebook风格的新闻提要?

Ruby on rails 如何在RubyonRails中创建facebook风格的新闻提要?,ruby-on-rails,Ruby On Rails,我正在尝试将对象融合到单个流中 我创建了一个名为Newsfeed的新模型和控制器。我有它,所以新闻提要有很多:消息,有很多:图像,图像和消息属于:新闻提要。我正在设置控制器,我有: def index @messages = Messages.all @images = Images.all @feed = ? end 当每一个都需要单独的格式化时,我如何融合它们以便它可以从两者中提取并按时间顺序排列它们 非常感谢您提供的任何帮助。这感觉像是一个有点繁重的问题,虽然我没

我正在尝试将对象融合到单个流中

我创建了一个名为Newsfeed的新模型和控制器。我有它,所以新闻提要有很多:消息,有很多:图像,图像和消息属于:新闻提要。我正在设置控制器,我有:

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中的一个内置方法,因此您不需要自己定义它。您可以看看:您最终选择的方向是什么?我还写了一篇文章,介绍如何以更优雅的方式在控制器/模型方面进行操作