如果我的模型具有以下字段:创建模型上第二视图和控制器
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