在我的索引页面上显示数据库中的所有项目。
@projects = Project.all
但我也想有一些按钮,可以改变这个列表。我有办法做到这一点。类似:
def today
@projects = Project.where('date BETWEEN ? AND ?', DateTime.now.beginning_of_day, DateTime.now.end_of_day).all
end
def this_week
@projects = Project.where('date BETWEEN ? AND ?', DateTime.now.beginning_of_day + 1, DateTime.now.end_of_day + 6).all
end
如何将这些方法添加到按钮中,以及单击时更改项目列表的显示?
MVC的快速概述可能会有所帮助。
-
模型-数据库之上的第一级,控制对象的属性(例如项目有日期(
-
控制器-模型和视图(以及路线,但将其放在一边(之间的交互
-
查看-浏览器和控制器之间的交互
您希望在索引视图上有一些"筛选"按钮。点击此按钮将:
-
将浏览器带到新的URL
-
触发一些javascript来管理当前视图的上下文
让我为以下每个选项指引正确的方向:
选项1A:每个按钮的新视图
你可以这样构造你的控制器:
class ProjectsController < ApplicationController
def index
@projects = Project.all
end
def today
@projects = Project.where('date BETWEEN ? AND ?', DateTime.now.beginning_of_day, DateTime.now.end_of_day).all
end
def this_week
@projects = Project.where('date BETWEEN ? AND ?', DateTime.now.beginning_of_day + 1, DateTime.now.end_of_day + 6).all
end
然后制定匹配的路线:
Rails.application.routes.draw do
...
resources :projects do
get 'today', on: :collection
get 'this_week', on: :collection
end
...
您还需要创建视图:today.html.erb
和this_week.html.erb
用户将单击一个按钮并进入projects/today
或projects/this_week
视图。
选项1B:允许您的索引处理参数过滤
你可以这样构造你的控制器:
class ProjectsController < ApplicationController
def index
start_date = params[:start] || DateTime.now.beginning_of_day
end_date = params[:end] || DateTime.now.end_of_day
@projects = Project.where('date BETWEEN ? AND ?', start_date, end_date).all
end
然后自定义你的按钮:
<%= button_to 'Today', projects_path() %>
<%= button_to 'This week', projects_path(start: DateTime.now.beginning_of_week, end: DateTime.now.end_of_week) %>
<%= button_to 'This year', projects_path(start: DateTime.now.beginning_of_year, end: DateTime.now.end_of_year) %>
这将使用URL中的参数重新加载Projects#index
,如:
"https://example.com/projects/?start=2019-01-01&end=2019-12-31"
您可以访问这些参数来智能地筛选您的项目。
选项2:Javascript&AJAX
这个很复杂。我建议查看一些教程。像这个:
https://www.rubyguides.com/2019/03/rails-ajax/