Rails新手在这里。
我在Rails 4.2中写博客,我希望在侧面导航栏中有链接,以根据创建帖子的月份过滤结果。我有正确显示的月份列表,但我无法显示包含正确过滤帖子的新索引页。
当用户点击侧面导航中的月份时,我想在params散列中发送该月份,然后使用if / else子句过滤结果。问题是我在视图中应用了strftime("%B")方法(以便月份更具可读性),然后将其传递给params哈希,但我无法应用它到控制器中的where子句。
在控制器中,我正在寻找类似的东西:
def index
if params[:month]
@posts = (:created_at.strftime("%B") => params[:month])
else
@posts = Post.all
end
但我得到错误信息:未定义的方法`strftime' for:created_at:Symbol
我认为的代码是:
<h4>By month </h4>
<% @posts.group_by{|post| post.created_at.strftime("%B")}.each do |month, values| %>
<%= link_to month, posts_path(:month => month) %>
<% end %>
我设法得到类似帖子类别的东西,但这是因为在我用params哈希发送它之前我还没有运行任何方法。
控制器中的工作代码:
def index
if params[:category]
@posts = Post.where(:category => params[:category]).order(created_at: :desc)
else
@posts = Post.all
end
end
视图中的工作代码:
<h4>By category</h4>
<% @posts.group_by{|post| post.category}.each do |category, value| %>
<%= link_to category, posts_path(:category => category) %>
<% end %>
我很欣赏任何关于如何让它发挥作用的想法。提前谢谢。
更新 最后使用控制器中的索引操作中的以下代码管理以使其工作:
@posts = Post.where("trim(to_char(created_at, 'month')) = ?", params[:month].downcase)
答案 0 :(得分:1)
您可以使用以下查询按月获取帖子:
Post.where("extract(month from created_at) = ?", params[:month])
我在Postgres数据库中试过这个。不确定这适用于Mysql。谢谢!
答案 1 :(得分:0)
也许值得尝试https://github.com/radar/by_star
有了这个宝石,你可以去Post.by_month(params[:month])
答案 2 :(得分:0)
您可以在模型中为其定义scope
:
scope :by_month, lambda { |date| where(:created_at => date.beginning_of_month..date.end_of_month).order(:created_at) }
这允许您在控制器列表操作中执行此操作:
selected_month = Time.parse(params[:month]) rescue Time.now
@posts = Post.by_month(selected_month)
要为每个独特的月份post
生成链接,您可以map
发布帖子,并为所有独特月份生成params[:month]
的链接:
<% @posts.only(:created_at).map {|p| p.created_at.beginning_of_month}.uniq.sort.each do |m| %>
<%= link_to m.strftime("%B"), :month => m %>
<% end %>