搜索日期范围的对象

时间:2019-02-13 16:58:33

标签: ruby-on-rails

我有一个日期范围的仪表板,用户可以在活动中搜索所需的时间段。

我使用同一Dasboard管理不同的模型

例如,我要查找:

  • 日期范围内的用户注册
  • 日期范围内的销售额
  • 等...

我有代表模型的按钮,单击它们会渲染相应的局部。

我可以搜索日期范围,但是在这种情况下,如果我点击下一个按钮 users ,则该日期范围仅适用于前一部分销售第一部分销售

这是因为默认情况下,仪表板操作显示会呈现 sales 。我需要一些东西来呈现当前的活动按钮...

您能帮我找个办法吗?

在一些代码下面:

dashboard.rb

class Dashboard

 attr_reader :date_from, :date_to

 def initialize(params)
    params ||= {}
    @date_from = parsed_date(params[:date_from],Time.now.beginning_of_month.to_date.to_s)
    @date_to   = parsed_date(params[:date_to], (Date.today + 1).to_s)
 end

 def article_date_range
    Article.where('created_at BETWEEN ? AND ?', @date_from, @date_to)
 end

 private 

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

dashboards_controller.rb

中的显示动作
  def show
    @button ||= set_button || :sales
    @dashboard = Dashboard.new(params[:search])
    @articles = @dashboard.article_date_range
    @articles = @articles.order('created_at ASC') 
 end

  private 

  def set_button
   button = dashboard__params[:button]&.to_sym and [:sales, :users].include?(button) and button
 end

此表单和按钮位于仪表板 show.html.erb

<%= form_tag admin_dashboard_path, method: :get do  %>
    <%= text_field_tag "search[date_from]", @dashboard.date_from, class: "datepicker" %>
    <%= text_field_tag "search[date_to]", @dashboard.date_to, class: "datepicker" %>
    <%= submit_tag "Rechercher", class: "btn btn-main" %>
<% end %>

 #the buttons that "redirect" to the appropriated partial

<% [:sales, :users, :articles].each do |button| %>
   <li class="tabs list-inline-item <%= params[:button] == button.to_s ? "tabs__item--active" : "tabs__item--inactive" %>">
    <%= link_to admin_dashboard_url(button: button) do  %>
      <%= button.capitalize %>
    <% end %>
   </li>
<% end %>
  

更新

     

这个想法是,用户选择一个日期范围,然后单击按钮以查看所选日期范围内商品销售和用户的活动(而无需再次选择日期范围)   enter image description here

1 个答案:

答案 0 :(得分:2)

我认为这是因为dashboard__params[:button]始终是nil。因为在您的搜索表单中,没有input设置为name的{​​{1}}字段。如果您在考虑button,它不在html表单之内。

因此方法<%= link_to admin_dashboard_url(button: button) do %>返回set_button

因此,nil操作的第一行始终返回show,因为如果:sales返回nil,则这是默认值。

我建议您在搜索表单中添加一个set_button字段。然后使用javascript阻止默认的表单提交行为,将hidden input字段的值设置为适当的值(hidden inputsales),然后使用javascript提交表单。

更新1

show.html.erb

user

现在在提交搜索表单之前使用javascript,设置hidden_​​filed的值。

更新2

show.html.erb

<%= form_tag admin_dashboard_path, method: :get do  %>
    <%= text_field_tag "search[date_from]", @dashboard.date_from, class: "datepicker" %>
    <%= text_field_tag "search[date_to]", @dashboard.date_to, class: "datepicker" %>
    <%= hidden_field_tag 'button', 'sales', id: 'button' %>
    <%= submit_tag "Rechercher", class: "btn btn-main" %>
<% end %>

 #the buttons that "redirect" to the appropriated partial

<% [:sales, :users, :articles].each do |button| %>
   <li class="tabs list-inline-item <%= params[:button] == button.to_s ? "tabs__item--active" : "tabs__item--inactive" %>">
    <%= link_to admin_dashboard_url(button: button) id: "#{button}_click" do  %>
      <%= button.capitalize %>
    <% end %>
   </li>
<% end %>

javascript(假设您有jQuery)

<%= link_to '#', id: "#{button}_click", class: 'model_link'  do  %>
  <%= button.capitalize %>
<% end %>