2016-11-13 26 views
0

我想按選定導演顯示所有影片。路線和控制器工作正常。但是,視圖中顯示的已過濾影片都是相同的。例如,我有四部電影,其中兩部有相同的導演。我想要的是在視圖頁面中顯示這兩個不同的元組,但是顯示的兩個元組是相同的。這是控制器代碼:導軌返回具有常見屬性的元組

def find_movies_by_same_director 
    @movie = Movie.find(params[:id]) 
    @director = @movie.director 
    if (not @director.nil?) and (not @director.empty?) 
    #@movies = Movie.find_all_by_director(@director) if (not @director.nil?) and (not @director.empty?); 
    @movies = Movie.find_by_sql("SELECT * FROM movies i WHERE i.director == '#{@director}'") 
    render :director 
    else 
    flash[:notice] = "'#{@movie.title}' has no director information" 
    redirect_to root_path 
    end 
end  

我試圖左右逢源,和的find_by_sql find_by_all,找到了元組,但他們都得到了相同的結果。 這是視圖代碼:

%tbody 
- @movies.each do |movie| 
    %tr 
    %th= @movie.title 
    %th= @movie.rating 
    %th= @movie.release_date 

我新的軌道,所以有任何意見或建議,將不勝感激。

+1

此外,無關你的問題,但在第6行執行搜索的更標準的Rails方式將是' @movies = Movie.where(導演:@director)'。更好的是,由於您不需要在視圖中使用'@ director',因此請執行'director = @ movie.director',然後執行'@movies = Movie.where(導演:導演)'。 – moveson

+0

它的工作原理!非常感謝你的詳細回覆。 – kchen

+0

很高興聽到它。當你有一刻時請接受答案。 – moveson

回答

1

在您的視圖代碼中,您使用的是實例變量@movie,它從控制器代碼的第2行返回原始搜索的結果。要在@movies中迭代時查看每部電影,需要使用在塊中聲明的局部變量。

%tbody 
- @movies.each do |movie| 
    %tr 
    %th= movie.title 
    %th= movie.rating 
    %th= movie.release_date 

如果這很讓人困惑,那麼您可以完全更改塊變量的名稱。這不會改變結果,但可能更具可讀性。

%tbody 
- @movies.each do |matched_movie| 
    %tr 
    %th= matched_movie.title 
    %th= matched_movie.rating 
    %th= matched_movie.release_date 

編輯:(有人建議我在我的評論添加到這個答案。)

這無關你的問題,但在執行第6行搜索的更標準的Rails的方式是@movies = Movie.where(director: @director) 。更重要的是,因爲你不需要在視圖中使用@director,你可以這樣做:

director = @movie.director 
@movies = Movie.where(director: director) 
+0

我想你也應該在回答中包含你的評論,評論有很好的建議。 –