2009-04-24 2 views
0

У меня есть модель, цель, которая содержит несколько записей, которые имеют временную метку. На соответствующем контроллере, я перечисляю месяцы этих записей, выполнив следующие:Rails: записи базы данных с пользовательским маршрутом ...?

В модели/target.rb

def month 
    self.recorded_on.strftime('%B') 
end 

В контроллеры/targets_controller.rb

@records = Target.find :all 

В мнений/целей/index.html.haml

%ul 
    - @records.group_by(&:month).sort.each do |month, data| 
    %li= link_to month, '' 

Это прекрасно работает для перечисления доступных месяцев для записей, которые у меня есть. Затем я хочу, чтобы вы могли щелкнуть по месяцу и получить отчет обо всех отчетах за этот месяц по следующему пути, сгенерированному с каждым годом и месяцем: /target/2009/04

Как бы я мог сделай это?

+0

Хорошо, я думаю, что это всего лишь вопрос маршрутизации, основанный на том, что я нашел до сих пор. Я думаю, что мне нужно что-то вроде: map.connect 'target /: year /: month', {: controller => 'target',: action => 'show',: year =>/[0-9] {4} /,: month =>/[0-9] {2} /} ... правильно? Тогда я могу использовать params [: month] & params [: year], чтобы вытащить нужные записи в моем действии на шоу? Но я не могу заставить этот маршрут работать ... что я делаю неправильно? – neezer

ответ

2

Добавить named scopes в вашу Target модель для поиска по годам и по месяцам. Что-то вроде:

class Target < ActiveRecord::Base 
    named_scope :by_month, 
    lambda { |month| { :conditions => ['MONTH(recorded_on) = ?', 
         month] }} 

    named_scope :by_year, 
    lambda { |year| { :conditions => ['YEAR(recorded_on) = ?', year] }} 
    . 
    . 
    . 
end 

(Обратите внимание, что условия здесь используется синтаксис MySQL.)

Предполагая, что вы используете RESTful маршруты, создать named route, как показано ниже в файле config/routes.rb (убедитесь, что это объявлены до маршрута по умолчанию):

map.targets_by_month '/targets/:year/:month', :controller => 'targets', 
       :requirements => { :year => /\d{4}/, :month => /\d{1,2}/ }, 
       :conditions => { :method => :get } 

— Вы можете использовать этот маршрут, на ваш взгляд, как это:

<%= link_to 'Show April 2009 Targets', targets_by_month_path('2009', '04') %> 

(Обратите внимание, что ведущий нуль в течение месяца не является обязательным из-за :requirements регулярного выражения в указанном маршруте, определенный выше)

Наконец, в вашем TargetsController, настроить index действия, чтобы использовать named_scopes определенное ранее:

def index 
    @records = Target.by_year(params[:year]).by_month(params[:month]) 
    . 
    . 
    . 
end 
+0

Я получаю эту ошибку для бита named_scope: SQLite3 :: SQLException: нет такой функции: YEAR: SELECT * FROM "target" WHERE ((MONTH (записанный_on) = NULL) AND (YEAR (записанный_on) = NULL)) ... ? – neezer

+0

Я не знал, что вы используете SQLite, потому что не указали. Тогда вам просто нужно использовать соответствующий SQL. См. Http://www.sqlite.org/lang_datefunc.html –

+0

Мой плохой, не указав, что: также, я думаю, вы неправильно набрали маршрут выше ... должен начать «map.targets_by_month», я думаю. Кроме того, по этим линиям маршрут, похоже, работает только с годом («/ target/2009»); если я поставлю месяц, я получу ошибку Неизвестного маршрута («/ target/2009/4»). Любая идея почему? – neezer

Смежные вопросы