2013-10-16 17 views
0

我运行红宝石2和Rails 4Rails的:限制索引视图来显示今天的条目只有

我创建一个应用程序,你可以追踪每一餐的热量和大量营养素,但我想这顿饭索引仅显示每个用户今天输入的内容,而不是他们曾经进入的每餐。

我目前只显示每天输入的内容,但底部的总数是所有进入的餐食,而不仅仅是今天的总数。我无法将.created_at.to_date == Date.current添加到@meals变量中。它会抛出一个undefined method 'created_at' for 1500:Fixnum

每个用户都有一个BMR,然后计算它们在特定日期剩余的卡路里量。我MealsController

我的索引视图:

<table> 
    <thead> 
    <tr> 
     <th>Name</th> 
     <th>Calories</th> 
     <th>Protein</th> 
     <th>Carbs</th> 
     <th>Fats</th> 
    </tr> 
    </thead> 

    <tbody> 
    <% @meals.each do |meal| %> 
     <tr class= "value"> 
     <% if meal.created_at.to_date == Date.current %> 
      <td><%= link_to meal.name, edit_meal_path(meal) %></td> 
      <td><%= meal.calories %></td> 
      <td><%= meal.protein %></td> 
      <td><%= meal.carbohydrates %></td> 
      <td><%= meal.fats %></td> 
     <% end %> 
     </tr> 
    <% end %> 
     <tr> 
     <td class="meal-total">Total:</td> 
     <td class="meal-total"><%= @meals.sum(:calories) %></td> 
     <td class="meal-total"><%= @meals.sum(:protein) %></td> 
     <td class="meal-total"><%= @meals.sum(:carbohydrates) %></td> 
     <td class="meal-total"><%= @meals.sum(:fats) %></td> 
     </tr> 
     <% unless current_user.bmr.nil? %> 
     <tr class="remaining"> 
      <td class="meal-remaining">Remaining:</td> 
      <td class="meal-remaining"><%= current_user.bmr - @meals.sum(:calories) %></td> 
      <td class="meal-remaining"><%= (current_user.bmr*0.4/4).to_i - @meals.sum(:protein) %></td> 
      <td class="meal-remaining"><%= (current_user.bmr*0.4/4).to_i - @meals.sum(:carbohydrates) %></td> 
      <td class="meal-remaining"><%= (current_user.bmr*0.2/9).to_i - @meals.sum(:fats) %></td> 
     </tr> 
     <% end %> 
    </tbody> 
</table> 

我MealsController:

class MealsController < ApplicationController 
    before_action :set_meal, only: [:edit, :update, :destroy] 
    before_action :authenticate_user!, except: :index 

    def index 
    @meals = current_user.meals if user_signed_in? 
    end 
    . 
    . 
    . 
    . 
end 

预先感谢您!

回答

3

首先,我想借此逻辑,这一点的看法,并把它放入控制器。

然后,您可以定义两个实例变量。

@todays_meals = current_user.meals.where("created_at > ? AND created_at < ?", Time.now.beginning_of_day, Time.now.end_of_day) 
@previous_meals = current_user.meals.where("created_at < ?", Time.now.beginning_of_day) 

当你这样做你依靠数据库来排序,而不是导轨或红宝石上,并且以更快的运算结果。而且,将逻辑放在视图之外也是一个很大的胜利。

编辑:

由于Davidann评论中提到的,你还可以通过创建模型内的范围内做到这一点。下面是这个的一个实现。

meal.rb

scope :today, lambda { 
    where('created_at > ?', Time.now.beginning_of_day) 
    .where('created_at < ?', Time.now.end_of_day) 
} 

@user.meals.today 

如果你发现自己在做我的第一个实施了很多次,创造像上面的一个范围。如果不是,那么是否希望这个示波器位于您的模型或您的控制器内部,取决于您。此外,请注意,范围内的lamdba需要允许在每次评估范围调用时调用Time.now。

+1

FWIW,拥有“瘦控制器”和“胖模型”可能会更好。请参阅[这里](http:// stackoverflow。com/questions/2550376/rails-skinny-controller-vs-fat-model-or-should-i-make-my-controller-anorexic)了解更多详情。 – Davidann

+0

我试过重新启动我的服务器,但它仍然给我:/Users/lukemacauley/tracktrack/app/controllers/meals_controller.rb:7:语法错误,意外的tCONSTANT,期待')'... als.where( “created_at <?”Time.now.beginning_of_day)...^/Users/lukemacauley/tracktrack/app/controllers/meals_controller.rb:7:语法错误,意外的')',期待keyword_end/Users/lukemacauley/tracktrack/app /controllers/meals_controller.rb:61:语法错误,意外的输入结束,期待keyword_end –

+0

刚刚解决:''created_at <?“''' –

2

有一些方法可以做到这一点,最简单的方法是添加an ActiveRecord scope,只有今天的饭菜。

This SO question/answers has several methods of doing it,挑你最喜欢的。

之后,你只需要改变这一点:

def index 
    @meals = current_user.meals.today if user_signed_in? 
end 
+0

您已经添加了两次相同的链接。你可以扩大一点,以最好的方式把它扩大到今天的餐点吗? –

+0

对不起,更新了...今天Google搜索“rails范围”让你有,这是一个很常见的事情。希望你能工作! –