Rails:从下拉列表中搜索数年和数月
我使用Rails 5.1,我试图用两个下拉选择列表-1搜索。 年,2个月 – 以及提交按钮。
在我看来:
"Year",:start_year => DateTime.now.year,:end_year => DateTime.now.year - 7, prefix: 'select'},{:field_name => 'year', :id => 'start-year'}) %> "month",use_short_month: true, prefix: 'select'},{:field_name => 'month', :id => 'start-month'}) %> "button", :class=>"Test", :name=>"submit") %>
在我的jobs_controller.rb中:
# GET /jobs.json def index if params[:year].present? or params[:month].present? month_with_leading_zero = params[:month].to_s.rjust(2, "0") start_date = "#{params[:year]}-#{month_with_leading_zero}-1" end_date = Time.now.strftime("%Y-%m-%d") @jobs = Job.where("datum_auftrag BETWEEN ? AND ?", start_date, end_date) else @search = Job.ransack(params[:q]) @jobs = @search.result end end
在我的数据库中,日期以格式保存:yyyy-mm-dd eg。 2011-01-20
单击提交按钮会忽略过滤,而是打印所有作业:
开始GET“/ jobs?utf8 =%E2%9C%93&start_date%5,5%5D = 2016&start_date%5Bmonth%5D = 1&submit = Search + Job”for :: 1 at 2018-01-17 14:01:54 +0100 Processing by JobsController #index as HTML参数:{“utf8”=>“✓”,“start_date”=> {“year”=>“2016”,“month”=>“1”},“submit”=>“搜索工作“}在布局/应用程序中渲染作业/ index.html.erb渲染作业/ _job_links.html.erb(38.5ms)作业加载(5.5ms)SELECT
jobs
。* FROMjobs
(1.3ms)SELECT COUNT( )FROMmanuscripts
WHEREmanuscripts
。job_id
= 20(2.2ms)SELECT COUNT( )FROMmanuscripts
WHERE mancuscripts 。job_id
= 21
我错过了什么?
1在索引页面上创建搜索表单
<%= form_tag your_index_action_path, method: :get do%> <%= select_year(Date.today, {:prompt => "Year",:start_year => DateTime.now.year,:end_year => DateTime.now.year - 7, prefix: 'select'},{:field_name => 'year', :id => 'start-year'}) %> <%= select_month(Date.today, {:prompt => "month",use_short_month: true, prefix: 'select'},{:field_name => 'month', :id => 'start-month'}) %> <%= submit_tag("Search Job", :id=>"button", :class=>"Test", :name=>"submit") %> <%end%>
注意: – 通过索引操作的路径替换your_index_action_path
,通过运行rake routes
路径获取控制台上的rake routes
2-在您的索引操作中,在控制器端单击提交按钮,您将获得以下参数
{"utf8"=>"✓", "select"=>{"year"=>"2018", "month"=>"1"}, "submit"=>"Search Job", "controller"=>"jobs", "action"=>"index"} permitted: false>
所以从这里你只需要params[:select][:year]
和params[:select][:month]
def index if params[:select][:year].present? || params[:select][:month].present? start_date = (params[:select][:year]+"-" +params[:select][:month]+"-"+Date.today.day.to_s).to_datetime.beginning_of_day end_date = Date.today.end_of_day @jobs = Job.where("datum_auftrag BETWEEN ? AND ?",start_date, end_date) else @jobs = Job.all end end
注意: – 它需要根据选定的值制作自定义日期,我使用了end_of_day
和end_of_day
方法来获得更清晰的搜索结果。
早些时候我给了你一个示例代码,你应该修改它,在这里我再次给你解决方案,请不要只是复制和粘贴使用调试器和pry在控制器端获得选定的日期和年份,但是我给这个回答几乎完成了。