在模型上创建第二个视图和控制器

时间:2013-05-12 14:02:03

标签: ruby-on-rails

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

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

如果我也希望按年查看这些数据,那么创建一个新的控制器并查看年份会更好吗?或者我应该使用路线吗?

3 个答案:

答案 0 :(得分:1)

我建议你也可以通过路线来做这件事,但尽管如此,你不需要在你担心的情况下提出多个控制器或视图。
您可以通过在Book中为routes.rb创建收集路由作为:

来执行此操作
resources :books do
  get '/by/:timeline', to: 'books#timeline', as: 'timeline', on: :collection
end

这将为您提供GET timeline_books_path,可以使用BooksController的{​​{1}}方法进行配置。

timeline之类的通话将提供URI:timeline_books_path('months')/books/by/months将等于'月',以便您params[:timeline]方式处理。
类似于timeline =&gt;的情况。 timeline_books_path('year')

希望它有所帮助。 :)

答案 1 :(得分:0)

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

SO做同样的事情(通过路线):

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

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

答案 2 :(得分:0)

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

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

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