如果我的模型有以下字段:
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
如果我还想按年查看这些数据,创建一个新的控制器并按年查看会更好吗?或者我应该使用路线来做到这一点?
我也建议通过路由来执行此操作,但尽管如此,您不需要多个控制器或视图,正如您在关注中提出的那样。您可以通过为in
创建一个集合路由来做到这一点:Book
routes.rb
resources :books do
get '/by/:timeline', to: 'books#timeline', as: 'timeline', on: :collection
end
这将为您提供一个 GET timeline_books_path
,可以在BooksController
'stimeline
方法中进行配置。
调用 liketimeline_books_path('months')
将使 URI: 可用,/books/by/months
并且params[:timeline]
将等于 'month' 供您在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
模型中可能是个好主意。如果您发现自己为此操作添加了很多过滤器,您可以将过滤逻辑重构到另一个类。