【发布时间】:2015-07-19 22:58:58
【问题描述】:
我们如何从主页设置:completed_at时间戳?
[2] pry(main)> Habit.find(18)
id: 1,
missed_days: 0,
conceal: false,
committed: ["tue", "wed", "thu", "fri", ""],
date_started: Wed, 22 Jul 2015 00:00:00 EDT -04:00,
action: "test",
user_id: 1,
created_at: Wed, 22 Jul 2015 17:37:59 EDT -04:00,
updated_at: Wed, 22 Jul 2015 17:38:01 EDT -04:00,
completed_at: nil,
控制器
def home
@habits = current_user.habits.committed_for_today.incomplete.order(:order)
end
通过设置:completed_at,模型会让控制器知道习惯已经完成(也就是不再incomplete)
habit.rb
class Habit < ActiveRecord::Base
belongs_to :user
has_many :levels, -> { order(:id) }
serialize :committed, Array
before_save :current_level
attr_accessor :missed_one, :missed_two, :missed_three
scope :incomplete, -> { where(completed_at: nil) }
def completed=(boolean)
self.completed_at = boolean ? Time.current : nil
end
def completed
completed_at && completed_at >= Time.current.beginning_of_day
end
def self.committed_for_today
today_name = Date::ABBR_DAYNAMES[Date.today.wday].downcase
ids = all.select { |h| h.committed.include? today_name }.map(&:id)
where(id: ids)
end
def save_with_current_level
self.levels.build
self.levels.build
self.levels.build
self.levels.build
self.levels.build
self.save
end
def current_level_strike
levels[current_level - 1] # remember arrays indexes start at 0
end
def current_level
return 0 unless date_started
def committed_wdays
committed.map do |day|
Date::ABBR_DAYNAMES.index(day.titleize)
end
end
def n_days
((date_started.to_date)..Date.yesterday).count do |date|
committed_wdays.include? date.wday
end - self.real_missed_days
end
case n_days
when 0..9
1
when 10..24
2
when 25..44
3
when 45..69
4
when 70..99
5
else
6
end
end
def real_missed_days
value = 0
levels.each do |level|
value += level.missed_days + level.days_lost
end
value
end
def calculate_days_lost
def n_days
((date_started.to_date)..Date.yesterday).count do |date|
committed_wdays.include? date.wday
end - self.real_missed_days
end
case n_days
when 0..9
n_days
when 10..24
n_days-10
when 25..44
n_days-25
when 45..69
n_days-45
when 70..99
n_days-70
else
n_days-100
end
end
def days_left_in_current_level
def n_days
((date_started.to_date)..Date.yesterday).count do |date|
committed_wdays.include? date.wday
end - self.real_missed_days
end
case n_days
when 0..9
10-n_days
when 10..24
25-n_days
when 25..44
45-n_days
when 45..69
70-n_days
when 70..99
100-n_days
else
0 # No end
end
end
end
我想用link_to 或button_tag 触发:completed_at。然后,一旦单击其中一项并设置了:completed_at,则主页应以redirect_to root_url 刷新,现在已删除:completed_at 习惯,因为主页仅显示incomplete 习惯。
这是它的Gist。
【问题讨论】:
-
什么控制器方法将习惯标记为完成?注意
link_to中的methodhas to be a valid HTTP verb -
是的,@AbM 我只是以它为例。我试图弄清楚如果有什么要放在控制器中,以及如何重写视图代码
标签: ruby-on-rails ruby model-view-controller