簡體   English   中英

如何在rails上的ruby中創建facebook樣式的新聞源?

[英]How do I create a facebook style news feed in ruby on rails?

我試圖將對象融合成一個流。

我創建了一個名為Newsfeed的新模型和控制器。 我有它所以新聞源has_many:消息和has_many:圖像和圖像和消息belongs_to:newsfeed。 我正在設置控制器,我有:

def index
    @messages = Messages.all
    @images = Images.all
    @feed = ?
end

我如何融合它們,以便它們可以從兩者中拉出來並按每個需要單獨形成時按時間順序排列?

非常感謝任何幫助,謝謝。

你可以做一些事情:

控制器:

def index
    messages = Messages.all
    images = Images.all
    @feed = (messages + images).order_by(&:created_at)
end

查看index.html.erb:

<%= render @feed %>

查看_feed.html.erb:

<% if feed.is_a? Message %>
  <%= render "message", :locals => {:message => feed}%>
<% else %>
  <%= render "image", :locals => {:image => feed}%>
<% end %>

並添加2個部分_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

然后在Newsfeed模型中,您可以根據需要進行拉取和整理:

def self.get_items
  item_list = []
  items = find(:all, :order => "created_at DESC", :limit => 30)
  items.collect{ |i| i.item_type.constantize.find(i.item_id) }
end

然后只需拉動它們,然后在您的視圖中顯示。

#Controller
def index
  @feed = Newsfeed.get_items
end

展望未來,我可能會開始將更多內容打包到流跟蹤模型中,以便在其他表上保存命中,但希望您能得到這個想法。

這感覺就像是一個有點問題,雖然我沒有時間深入挖掘它,但這里有一些初步的想法:

  1. 您可以將要顯示的兩種類型的項目組合到一個數組中,然后根據兩者之間應該是通用的字段(創建__art)來對這個數組進行排序,以使它們按時間順序排列。

  2. 在視圖中,您可以使用此單個集合進行迭代,然后使用幫助程序和唯一的部分來以正確的格式呈現項目。 這可以通過在嘗試在視圖中顯示對象類型時檢查對象類型來完成。

有點像:

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:如果我自己寫這篇文章,我可能會像這樣處理這些觀點:

在頂層,只需將您的Feed集合傳遞給部分,該部分旨在呈現單個項目:

render :partial => "item", :collection => @feed

這將為@feed中的每個項呈現'_item.html.erb'部分。 此外,它每次都會給部分一個名為'item'的局部變量,這是該特定迭代的@feed中的項。

現在,我可能會讓'_item'部分非常簡單,就像這樣:

<%= display_item(item) %>

其中display_item是視圖外的輔助方法,並使用“is_a?”實現 從上面輸入邏輯,為項目選擇正確的顯示格式。

我之所以如此分手是因為它利用了一些漂亮的rails功能(將集合傳遞給部分而不是自己循環遍歷集合)然后將邏輯拉出到幫助器中(如果有意義的話,甚至是模型) to)很有用,因為它簡化了你的觀點。 盡可能將邏輯排除在視圖之外通常是一種很好的做法,因為這樣的邏輯很難測試,並且您的視圖將變得非常難以閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM