Ruby on rails 搜索具有日期范围的对象

Ruby on rails 搜索具有日期范围的对象,ruby-on-rails,Ruby On Rails,我有一个带有日期范围的仪表板,用户可以在activy中搜索他想要的时间段 我用同一个仪表板管理不同的型号 例如,我想找到: 用户注册的日期范围为 日期范围内的销售额 等等 我有代表模型的按钮,单击它们可以渲染相应的部分 我可以搜索日期范围,但它仅适用于第一部分销售在这种情况下,如果我单击下一步按钮,即用户第一部分销售 这是因为仪表板操作显示在默认情况下呈现sales我需要一些东西来呈现当前活动按钮 你能帮我找到怎么做吗 下面是一些代码: 仪表板.rb class Dashboard at

我有一个带有日期范围的仪表板,用户可以在activy中搜索他想要的时间段

我用同一个仪表板管理不同的型号

例如,我想找到:

  • 用户注册的日期范围为
  • 日期范围内的销售额
  • 等等
我有代表模型的按钮,单击它们可以渲染相应的部分

我可以搜索日期范围,但它仅适用于第一部分销售在这种情况下,如果我单击下一步按钮,即用户第一部分销售

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

你能帮我找到怎么做吗

下面是一些代码:

仪表板.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
  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
<%= 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 %>
<%= 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 %>
<%= link_to '#', id: "#{button}_click", class: 'model_link'  do  %>
  <%= button.capitalize %>
<% end %>
仪表板\u controller.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
  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
<%= 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 %>
<%= 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 %>
<%= link_to '#', id: "#{button}_click", class: 'model_link'  do  %>
  <%= button.capitalize %>
<% end %>
此表单和按钮位于仪表板show.html.erb

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
  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
<%= 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 %>
<%= 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 %>
<%= link_to '#', id: "#{button}_click", class: 'model_link'  do  %>
  <%= button.capitalize %>
<% end %>

#“重定向”到相应部分的按钮
  • 更新 其思想是用户选择一个日期范围,然后单击按钮,查看商品销售和用户在所选日期范围内的活动(无需再次选择日期范围)


    我想这是因为,
    dashboard\uu参数[:button]
    总是
    nil
    。因为在搜索表单中,没有
    输入
    字段将
    名称
    设置为
    按钮
    。如果您考虑的是
    ,那么它就在html表单之外

    所以方法
    set_按钮
    返回
    nil

    因此,
    show
    操作的第一行始终返回
    :sales
    ,因为如果
    set\u按钮返回nil,这是默认值

    我建议在搜索表单中添加一个
    隐藏输入
    字段。然后使用javascript阻止默认表单提交行为,将
    隐藏输入
    字段的值设置为适当的值(
    sales
    user
    ),然后使用javascript提交表单

    更新1 show.html.erb

    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
    
      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
    
    <%= 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 %>
    
    <%= 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 %>
    
    <%= link_to '#', id: "#{button}_click", class: 'model_link'  do  %>
      <%= button.capitalize %>
    <% end %>
    

    我想这是因为,
    dashboard\uu参数[:button]
    总是
    nil
    。因为在搜索表单中,没有
    输入
    字段将
    名称
    设置为
    按钮
    。如果您考虑的是
    ,那么它就在html表单之外

    所以方法
    set_按钮
    返回
    nil

    因此,
    show
    操作的第一行始终返回
    :sales
    ,因为如果
    set\u按钮返回nil,这是默认值

    我建议在搜索表单中添加一个
    隐藏输入
    字段。然后使用javascript阻止默认表单提交行为,将
    隐藏输入
    字段的值设置为适当的值(
    sales
    user
    ),然后使用javascript提交表单

    更新1 show.html.erb

    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
    
      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
    
    <%= 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 %>
    
    <%= 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 %>
    
    <%= link_to '#', id: "#{button}_click", class: 'model_link'  do  %>
      <%= button.capitalize %>
    <% end %>
    


    请注意,可以使用搜索工具搜索范围<代码>位置(创建于:@date\u from..@date\u to)
    是,我在其他地方使用它;)您是否尝试过类似的方法:
    @button | |=(set | button | |:sales)
    ?是的,但这不会改变任何内容。请注意,可以使用搜索工具搜索范围<代码>位置(创建于:@date\u from..@date\u to)
    是,我在其他地方使用它;)您是否尝试过类似的方法:
    @button | |=(set | button | |:sales)
    ?是的,但这不会改变任何事情谢谢您@mehedi,我会尝试一下,根据这个建议,我需要为每个模型创建一个表单?实际上,我只需要一个表单。@johan我已经更新了我的答案,显示了如何修改your
    show
    视图。只有一件事,你是重定向到一个部分还是渲染一个部分?因为从技术上讲,我认为你不能重定向到一个部分,你只能重定向到一个视图。我不习惯使用javascript,我应该编写一个事件侦听器?@johan是用户先提交搜索表单,然后单击链接到管理员仪表板的url(按钮:button)。因为我看到搜索表单中已经有一个提交按钮
    Thank you@mehedi,所以我会试试这个,建议我需要为每个模型创建一个表单?实际上,我只需要一个表单。@johan我已经更新了我的答案,显示了如何修改your
    show
    视图。只有一件事,你是重定向到一个部分还是渲染一个部分?因为从技术上讲,我认为你不能重定向到一个部分,你只能重定向到一个视图。我不习惯使用javascript,我应该编写一个事件侦听器?@johan是用户先提交搜索表单,然后单击链接到管理员仪表板的url(按钮:button)。因为我看到搜索表单中已经有一个提交按钮