2013-05-12 65 views
0

如果我的模型具有以下字段:創建模型上第二視圖和控制器

class Book < ActiveRecord::Base 
    attr_accessible :author, :title, :year, :month 
    scope :recent, order('year desc, month desc').limit(3) 
end 

,如果我還希望通過一年來查看這個數據,是能夠更好地創造今年新的控制器和視圖?或者我應該使用路線嗎?

回答

1

我會建議通過多種途徑也這樣做,但儘管是,你不需要多個控制器或視圖正如你提出你的擔心一樣。
可以在routes.rb做到這一點,通過創建Book集合路線爲:

resources :books do 
    get '/by/:timeline', to: 'books#timeline', as: 'timeline', on: :collection 
end 

這將爲您提供一個GET timeline_books_path,它可以在BooksControllertimeline方法來配置。

呼叫像timeline_books_path('months')將提供的URI:/books/by/monthsparams[:timeline]將等於「月」爲您效勞的timeline方法。
類似的情況是timeline_books_path('year') =>/books/by/year

希望它有幫助。 :)

+0

我使用時間線作爲變量而不是您建議的字符串,所以您可以/書籍/ by/2012或/ books/by/2012等。 – 2013-05-12 16:08:41

+0

這是一個不錯的方法。給你更多的靈活性;但是你的控制器邏輯剛剛變得更多。 :) – kiddorails 2013-05-12 16:17:14

0

不,你應該重用當前視圖和控制器。最簡單的方法是將一個參數添加到index行動:

class BooksController < ApplicationController 
    def index 
    if params[:year] 
     @books = Book.where(:year => params[:year]) 
    else 
     @books = Book.scoped 
    end 
    end 
end 

而且,它可能是這個過濾器移動到Book模型是一個好主意。如果您發現自己爲此操作添加了大量過濾器,則可以將過濾邏輯重構爲另一個類。

相關問題