【问题标题】:Filter by date using materializecss on rails使用 Rails 上的 materializecss 按日期过滤
【发布时间】:2017-08-13 04:58:18
【问题描述】:

我试图在加载页面时显示我的所有项目,如果选择了日期(使用 materializecss datepicker),则仅显示项目的日期范围。显示所有项目很容易,因为我只需要执行 @all_requests = Request.all,但我花了两个晚上尝试各种方法,如 form_for 和 form_tag 等。目前,由于默认日期,下面的代码仅显示今天的项目。今天,但是如果我删除默认值,它会给出一个零错误,我认为是因为尚未选择日期......

Index.html.erb

 <%= form_tag requests_path, method: :get do %>
   <%= text_field_tag 'search[date_from]', @search.date_from, placeholder: 'From date', class: 'datepicker'  %>
   <%= text_field_tag 'search[date_to]', @search.date_to, placeholder: 'To date', class: 'datepicker' %>
   <%= submit_tag 'Search', class: 'btn waves-effect waves-light formbttn' %>
   <% end %>

  <div class="row">
    <% @all_requests.each do |request| %>
    ...

Request.search.rb

class RequestSearch
  attr_reader :date_from, :date_to

  def initialize(params)
    params ||= {}
    date_from = parsed_date(params[:date_from], Date.today.to_s)
    date_to = parsed_date(params[:date_to], Date.today.to_s)
  end

  def scope
    Request.where(:date => 'date_from'..'date_to')
  end

  def parsed_date(date_string, default)
    Date.parse(date_string)
  rescue ArgumentError, TypeError
    default
  end
end

Requests_controller.rb

  def index
    # if params[:search] == nil
    #   @all_requests = Request.all
    # else
      @search = RequestSearch.new(params[:search])
      @all_requests = @search.scope
  end

Materializecss DOM

<input type="text" name="" id="search_date_from" value="2017-08-13"
 placeholder="From date" class="datepicker picker__input" readonly="" 
tabindex="-1" aria-haspopup="true" aria-expanded="false" 
aria-readonly="false" aria-owns="search_date_from_root">

【问题讨论】:

  • Request.where(:date =&gt; date_from..date_to) - 去掉引号。

标签: ruby-on-rails materialize


【解决方案1】:
class RequestSearch
  attr_reader :date_from, :date_to

  # use keyword args instead
  def initialize(date_from: nil, date_to: nil, **kwargs)
    # You need to use `@` to set instance vars
    @date_from = parsed_date(date_from)
    @date_to = parsed_date(date_to)
  end

  def scope
    Request.where(date: date_from..date_to)
  end

  # reduce the arity by setting the default in the method
  # definition
  def parsed_date(date_string, default = Date.today.to_s)
    Date.parse(date_string)
  rescue ArgumentError, TypeError
    default
  end
end

【讨论】:

  • 我收到了这个错误:参数数量错误(给定 1,预期为 0) def initialize(date_from: nil, date_to: nil, **kwargs) 是不是因为我已经传入了整个参数 [ :search] 在控制器中?
猜你喜欢
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多