2012-05-02 48 views
5

Vì vậy, tôi có chế độ xem lịch hàng tuần và tôi đã thiết lập tuyến đường để chấp nhận /: năm /: tháng /: ngày cho ngày bắt đầu.Tuyến đường ray có ngày

match "events/(:year/:month/:day)" => "events#index", 
     :constraints => { :year => /\d{4}/, :month => /\d{2}/, :day => /\d{2}/ }, 
     :as => "events_date" 

Tôi có hai câu hỏi liên quan đến việc sử dụng tuyến đường này. Trước tiên, khi phân tích cú pháp các tham số, đây là những gì tôi đang thực hiện:

unless params[:year].nil? || params[:month].nil? || params[:day].nil? 
    start_date = Date.new(params[:year].to_i, params[:month].to_i, params[:day].to_i) 
end 
start_date = start_date.nil? ? Date.today : start_date 

Điều này khiến tôi khá là tiết tú và xấu xí. Có cách nào tốt hơn?

Và khi thực hiện một liên kết đến tuần khác trong lịch (đối với tuần phân trang để tuần), làm tôi phải làm một cái gì đó giống như

#assume an date object with the desired start date 
link_to events_date_path(date.strftime('%Y'), date.strftime('%m'), date.strftime('%d')) 

nào cũng dường như loại verbose và xấu xí. Cách tốt nhất để làm việc với các ngày trong các tuyến đường là gì?

+0

Có lý do nào cần phải đọc được ở người không và ở định dạng đó? Nó sẽ có ý nghĩa hơn để có nó thiết lập như là phù hợp "sự kiện/(: ngày)" nơi: ngày kết thúc lên được như "2012-05-01" và bạn có thể làm một strftime trực tiếp trên đó vào một đối tượng ngày thực tế? –

+0

Không, đây là một dự án hoàn toàn cá nhân, đây là một bài tập lập trình nhiều vì nó là một vấn đề thực sự – DVG

+0

Tôi cho rằng tôi sẽ trả lời câu trả lời cho một trường câu trả lời thực tế. ;) –

Trả lời

8

Đề xuất của tôi sẽ không sử dụng ba biến riêng biệt. Bằng cách đó bạn không kết thúc với rất nhiều kiểm tra null và kiểm tra sanity trong bộ điều khiển của bạn. Bạn có thể biến trận đấu của bạn vào một cái gì đó trông như thế này, với các ràng buộc của bạn vẫn nguyên vẹn:

match "events/(:date)" => "events#index", 
     :constraints => { :date => /\d{4}-\d{2}-\d{2}/ }, 
     :as => "events_date" 

Vì vậy bạn sẽ kết thúc với một chút gì đó lành mạnh hơn trong bộ điều khiển:

unless params[:date] 
    start_date = params[:date].strftime("%Y-%m-%d').to_date # assuming you want a Date 
end 

Và tôi thường làm những loại 'nếu điều này được thiết lập' kiểm tra cái gì đó nhiều như thế này, bởi vì tôi thấy nó một chút dễ đọc hơn:

start_date = Date.today unless defined? start_date 

Bạn thậm chí có thể cuộn những cuối cùng hai với nhau:

start_date = defined?(params[:date]) ? params[:date].strftime("%Y-%m-%d').to_date : Date.today 
+0

Cũng lưu ý rằng bạn có thể chuyển trực tiếp đến ngày bằng cú pháp này: Date.strptime (params [: date], '% Y-% m-% d') –

+0

Điểm quan tâm, bạn có thể sử dụng dấu gạch chéo ở phía trước không của các param chính nó mà không vi phạm các phần ra thành các biến riêng biệt? – DVG

+0

Tôi không tích cực. Tôi đoán là có, nhưng tôi sẽ không khuyên bạn nên vì nó hơi mơ hồ. Tuyến đường của bạn sẽ đọc "sự kiện/(: ngày)" và bạn nhận được "sự kiện/2012/05/01". Để tâm trí của tôi mà chỉ cảm thấy một chút bẩn, kể từ khi bạn đang nghĩa vụ phải chia tách trên/'s trong một tuyến đường. –

Các vấn đề liên quan