我有一个显示所有帖子的帖子索引页面。在该页面中,我需要使用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>
<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
答案 0 :(得分:0)
以下是我为回答您的问题而做出的一些假设。如有任何更改,请告知我,我将相应地修改答案。
假设:
您可以在下面找到我的解决方案:
替换
<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
方法将验证开始日期和结束日期是否均已通过并且是有效日期。
如果传递了有效的开始日期和结束日期,则可以在时间范围内获取帖子。否则,将提取所有帖子。
希望这对您有所帮助。