Rails 5.1下拉菜单选择年月搜索失效问题求助
Rails 5.1 日期筛选功能失效问题排查
嗨,我帮你找到了问题所在!你看提交后的请求日志参数,和控制器里取参数的方式完全不匹配,这就是筛选没生效的核心原因~
先看你的请求日志里的参数结构:
Parameters: {"utf8"=>"✓", "start_date"=>{"year"=>"2016", "month"=>"1"}, "submit"=>"Search Job"}
年份和月份都被包裹在start_date这个哈希里,但你的控制器代码里直接尝试获取params[:year]和params[:month]——这两个值其实都是nil!所以if params[:year].present? or params[:month].present?这个条件根本不会触发,代码直接走到else分支,用ransack返回了所有jobs,自然看不到筛选效果。
下面给你两种可行的解决办法,任选其一即可:
方案一:修改控制器,从正确的参数位置取值
调整index方法里的参数获取逻辑,从params[:start_date]哈希里取出年份和月份:
def index # 确保start_date存在且year、month都不为空 if params[:start_date].present? && params[:start_date][:year].present? && params[:start_date][:month].present? year = params[:start_date][:year] month_with_leading_zero = params[:start_date][:month].to_s.rjust(2, "0") start_date = "#{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
这里我还优化了条件判断,避免因year或month为空导致日期格式错误的问题。
方案二:修改视图,让参数直接以year/month形式传递
修改select_year和select_month的prefix参数,去掉这个前缀后,参数就不会嵌套在start_date里了:
<%= form_tag jobs_path, method: :get do %> <%= select_year(Date.today, { prompt: "Year", start_year: DateTime.now.year, end_year: DateTime.now.year - 7, prefix: nil }, { field_name: 'year', id: 'start-year' } ) %> <%= select_month(Date.today, { prompt: "month", use_short_month: true, prefix: nil }, { field_name: 'month', id: 'start-month' } ) %> <%= submit_tag("Search Job", id: "button", class: "Test", name: "submit") %> <% end %>
这样提交后,参数就会变成{"year"=>"2016", "month"=>"1"},你的原控制器代码就能正常获取到参数,筛选逻辑也就生效了。
内容的提问来源于stack exchange,提问作者Trinity76
相关产品推荐
相关产品推荐

