在Rails中使用日期选择器根据开始日期和结束日期过滤帖子

时间:2018-08-29 09:25:53

标签: html ruby-on-rails scope datepicker

我有一个显示所有帖子的帖子索引页面。在该页面中,我需要使用datepicker设置一个过滤器,该过滤器提供开始和结束日期。当用户单击搜索按钮时,它会向控制器发送一个get方法请求开始日期和结束日期作为参数。我需要在帖子模型中使用范围方法来过滤帖子。作为Rails的新手,我不知道在创建html视图后如何继续操作。

Index.html.erb

<div class="container" >

  <% if params[:topic_id].present? %>
    <h2 align="center"><span class="em-text"><%= @topic.topicname %> Posts</span></h2><hr>
    <%= link_to "New Post", new_topic_post_path, :class => 'btn btn-primary new_one' ,remote: true%> <br><br><br>
  <% else %>
    <h2 align="center"><span class="em-text">All Posts</span></h2><hr>
  <% end %>
  <div>
    <input type="date" id="start_date">
    <input type="date" id="end_date">
  </div>

<div class="post_div">
  <%= render @posts %>
</div>
  <%= will_paginate @posts, renderer: BootstrapPagination::Rails %>
</div>
发布部分为render

  <div class="well">

    <% if ReadStatus.where(" user_id = ? AND post_id = ?",current_user.id,post.id).blank? %>
      <p style="color:Tomato;",class="read_text">Unread!!</p>
    <%end %>

    <h4><b><%= post.title  %> (<%= post.topic.topicname %>)</b></h4>
    <p><%= post.body %></p>

    <div>

      <%= image_tag post.image.url(:thumb) %>

    </div>

    <%= "Average Rating: "  %>
    <%=post.ratings.average(:rate).to_f.round(1)%>
    <br>
    <%= link_to "comments",topic_post_path(topic_id:post.topic_id, id:post.id) %>
    <%=post.comments.count%>
    <%= link_to "View Post", topic_post_path(topic_id:post.topic_id, id:post.id ), :class => 'btn btn-default btn1'%>
    <% if can? :update, post %>
      <%= link_to "Edit", edit_topic_post_path(topic_id:post.topic_id, id:post.id), :class => 'btn btn-primary' %>
    <% end %>
    <% if can? :destroy, post %>
      <%= link_to "Delete", [post.topic, post], method: :delete, data: {confirm: 'Are you sure?'}, :class => 'btn btn-danger' %>
    <% end %>

  </div>

控制器后索引操作:

  def index
 @posts=Post.all
 end

1 个答案:

答案 0 :(得分:0)

以下是我为回答您的问题而做出的一些假设。如有任何更改,请告知我,我将相应地修改答案。

假设:

  • 您有一个按钮来发送开始日期和结束日期作为搜索参数。
  • 搜索请求将作为HTML请求发送。
  • 过滤器基于帖子的创建时间。
  • 您正在使用Rails 5 +

您可以在下面找到我的解决方案:

替换

<input type="date" id="start_date">
<input type="date" id="end_date">

使用

<%= form_tag posts_path, method: :get do %>
  <%= text_field_tag 'start_date', params[:start_date], placeholder: "Enter Start Date" %>
  <%= text_field_tag 'end_date', params[:end_date], placeholder: "Enter End Date" %>
  <%= submit_tag 'Search' %>
<% end %>

将以下代码添加到Posts控制器中:

before_action :can_search, only: %i(index)

def index
  @posts = @can_search ? Post.where(created_at: Time.parse(params[:start_date])..Time.parse(params[:end_date]))
end

private

def can_search
  @can_search = false
  return unless (params[:start_date].present? && params[:end_date].present?)
  @can_search = (Time.parse(params[:start_date]) rescue nil).present? && (Time.parse(params[:end_date]) rescue nil).present?
  if @can_search
    @can_search = Time.parse(params[:start_date]) < Time.parse(params[:end_date]
  end
end

视图中的表单使您可以将开始日期和结束日期作为params发送到索引操作。

before_action方法将验证开始日期和结束日期是否均已通过并且是有效日期。

如果传递了有效的开始日期和结束日期,则可以在时间范围内获取帖子。否则,将提取所有帖子。

希望这对您有所帮助。