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 。* FROM jobs (1.3ms)SELECT COUNT( )FROM manuscripts WHERE manuscripts job_id = 20(2.2ms)SELECT COUNT( )FROM manuscripts WHERE mancuscriptsjob_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_dayend_of_day方法来获得更清晰的搜索结果。

早些时候我给了你一个示例代码,你应该修改它,在这里我再次给你解决方案,请不要只是复制和粘贴使用调试器和pry在控制器端获得选定的日期和年份,但是我给这个回答几乎完成了。