2013-08-21 43 views
0

我有一個名爲電影的軌道表。電影正在從API中收集和保存,這意味着某些電影可能有release_date,有些電影可能不會。Rails。除了如果

所有的電影都顯示在主頁上,他們被{|t| - t.release_date.strftime("%Y%m%d").to_i}

<% @movies.sort_by{|t| - t.release_date.strftime("%Y%m%d").to_i}.each do |movie| %> 

<% movie.title %> 
<% movie.release_date.strftime("%Y") %> 

<% end %> 

排序所以這段代碼工作正常,但只只要返回的電影有一個發佈日期。如果他們沒有分配發布日期,它會給我以下錯誤。

ActionView::Template::Error (undefined method `strftime' for nil:NilClass): 

但即時獲得這個錯誤,如果電影沒有release_date。 那麼我如何添加一個異常,只顯示電影與release_date,其中使用strftime將不再是一個問題。

我已經試過

<% unless movie.release_date.blank? %> 

<% @movies.sort_by{|t| - t.release_date.strftime("%Y%m%d").to_i}.each do |movie| %> 

<% @movie.title %> 
<% @movie.release_date.strftime("%Y") %> 

<% end %> 

<% end %> 

但是,這並不工作,因爲它給出了一個undefined method for 'movie'

回答

1

你應該能夠使用reject拒絕零RELEASE_DATE像如下:

<% @movies.reject{ |m| m.release_date.nil? } %> 

的另一個問題是,你正在使用的變量movie作爲實例變量@movieeach塊中。

嘗試:

<% @movies.reject{ |m| m.release_date.nil? }.sort_by{|t| - t.release_date.strftime("%Y%m%d").to_i}.each do |movie| %> 

<% movie.title %> 
<% movie.release_date.strftime("%Y") %> 

<% end %> 

更新:

是的,在他的回答指向的@NicolasGarnil,最好在SQL一邊做這些比紅寶石側。只選擇需要的記錄並讓數據庫進行排序。所以,你可以更新你的代碼是這樣的:

在控制器:

@movies = Movie.where('release_date is not null').order('release_date desc'); 

然後在您的視圖:

<% @movies.each do |movie| %> 

<% movie.title %> 
<% movie.release_date.strftime("%Y") %> 

<% end %> 
+0

我正在嘗試它在生產模式,因爲那是我得到的錯誤。 是的我實際上並沒有將它作爲<% @movie %>在我的代碼中,我只是直接寫入StackO,所以我沒有在Rails Mindset^_ ^編輯它。 – PMP

+0

@PMP,在這種情況下,您可以添加'reject {| m | m.release_date.nil? } @ – vee

+0

@PMP,我不應該忘記告訴你,直接在生產中修改是非常不鼓勵的! – vee

1

對於你不應該使用紅寶石給您的記錄進行排序性能的原因。這應該在數據庫級別完成。

您應該首先確保release_date值以適當的格式保存,然後使用Movie.order("release_date desc")。具有空值的記錄將被放置在結果的末尾。

+0

首先,使用'@ movies.sort( 「RELEASE_DATE降序」) '(這是你的第一個答案)不起作用,因爲它給了我很多參數(1代表0)_ – PMP

+0

然後在控制器中使用'Movie.sort(「release_date DESC」)',我想,給我這個錯誤_undefined方法'排序'for_ – PMP

+0

對不起,我打算說順序,不排序。已經更新。 –