0

如果我的模型有以下字段:

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

如果我还想按年查看这些数据,创建一个新的控制器并按年查看会更好吗?或者我应该使用路线来做到这一点?

4

3 回答 3

1

我也建议通过路由来执行此操作,但尽管如此,您不需要多个控制器或视图,正如您在关注中提出的那样。您可以通过为in
创建一个集合路由来做到这一点:Bookroutes.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

希望能帮助到你。:)

于 2013-05-12T15:19:48.897 回答
0

我认为通过路由或查询字符串会更好,而不是几个动作。只需根据不同的路由或参数发送一个动作的响应。

SO也这样做(按路线):

https://stackexchange.com/leagues/1/month/stackoverflow/

https://stackexchange.com/leagues/1/year/stackoverflow

于 2013-05-12T14:10:33.957 回答
0

不,您应该重用当前视图和控制器。最简单的方法是向index操作添加参数:

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

此外,将此过滤器移动到Book模型中可能是个好主意。如果您发现自己为此操作添加了很多过滤器,您可以将过滤逻辑重构到另一个类。

于 2013-05-12T16:06:20.253 回答