如果我的模型具有以下字段:創建模型上第二視圖和控制器
class Book < ActiveRecord::Base
attr_accessible :author, :title, :year, :month
scope :recent, order('year desc, month desc').limit(3)
end
,如果我還希望通過一年來查看這個數據,是能夠更好地創造今年新的控制器和視圖?或者我應該使用路線嗎?
如果我的模型具有以下字段:創建模型上第二視圖和控制器
class Book < ActiveRecord::Base
attr_accessible :author, :title, :year, :month
scope :recent, order('year desc, month desc').limit(3)
end
,如果我還希望通過一年來查看這個數據,是能夠更好地創造今年新的控制器和視圖?或者我應該使用路線嗎?
我會建議通過多種途徑也這樣做,但儘管是,你不需要多個控制器或視圖正如你提出你的擔心一樣。
可以在routes.rb
做到這一點,通過創建Book
集合路線爲:
resources :books do
get '/by/:timeline', to: 'books#timeline', as: 'timeline', on: :collection
end
這將爲您提供一個GET timeline_books_path
,它可以在BooksController
的timeline
方法來配置。
呼叫像timeline_books_path('months')
將提供的URI:/books/by/months
和params[:timeline]
將等於「月」爲您效勞的timeline
方法。
類似的情況是timeline_books_path('year')
=>/books/by/year
。
希望它有幫助。 :)
我認爲通過路由或查詢字符串會更好,而不是幾個動作。只需根據不同的路線或參數發送一個動作的響應。
SO做同樣的(按航線):
不,你應該重用當前視圖和控制器。最簡單的方法是將一個參數添加到index
行動:
class BooksController < ApplicationController
def index
if params[:year]
@books = Book.where(:year => params[:year])
else
@books = Book.scoped
end
end
end
而且,它可能是這個過濾器移動到Book
模型是一個好主意。如果您發現自己爲此操作添加了大量過濾器,則可以將過濾邏輯重構爲另一個類。
我使用時間線作爲變量而不是您建議的字符串,所以您可以/書籍/ by/2012或/ books/by/2012等。 – 2013-05-12 16:08:41
這是一個不錯的方法。給你更多的靈活性;但是你的控制器邏輯剛剛變得更多。 :) – kiddorails 2013-05-12 16:17:14