Самостоятельно удаляющий контрольный список, не удаляющий элементы

Я создаю самоуничтожающийся контрольный список с Ruby on Rails, который должен автоматически удалять элемент по истечении 7 дней. Но элемент просто остается и уходит в минус ( -1, -2, -3 и т. Д.) Я не уверен, где именно проблема.

Мое действие уничтожения работает на все остальное.

Я исследовал весь стек и Google, но не нашел ничего полезного.

Вот мой контроллер предметов:

class ItemsController < ApplicationController
  before_action :find_item, only: [:show, :edit, :update, :destroy]

  def index
    @items = Item.all
    @items = Item.where(user: current_user)
  end

  def new
    @item = Item.new
    # authorize @item
  end

  def create
    @item = current_user.items.build(item_params)
    @item.expires_at = Time.now + 7.days
    # authorize @item
     if @item.save
      redirect_to @item, notice: "Item was added!"
     else
       flash[:error] = "Error adding item. Please try again! Your organization depends on it!"
       render :new
     end
  end

  def show
    @item = Item.find(params[:id])
    @item.days_left 
  end


  def edit
    @item = Item.find(params[:id])
  end

  def update
    @item = Item.find(params[:id])
    if @item.update_attributes(item_params)
      flash[:notice] = "Item was updated."
       redirect_to item_path
    else
       flash[:error] = "There was an error saving the item. Please try again."
       render 'edit'
    end
  end

  def destroy
    if @item.days_left == 0
      @item.destroy
    end

    @item.destroy
    redirect_to items_path
  end



  def completed
    @item = Item.find(params[:id])
    @item.update_attribute(:completed, true)
    redirect_to items_path
  end

  private


  def item_params
    params.require(:item).permit(:name, :user, :description)
  end

  def find_item
    @item = Item.find(params[:id])
  end
end

И модель товара:

    class Item < ActiveRecord::Base
  belongs_to :user

  def completed
     completed == true
  end

   default_scope { order('expires_at ASC') }

   def days_left
      7 - (DateTime.now.to_date - created_at.to_date).to_i
   end

end

routes.rb

Rails.application.routes.draw do


  get 'about' => 'welcome#about'

  get "users/dashboard" => "items#index"

  root to: 'welcome#index'



  devise_for :users
  resources :users, only: [:update, :show, :index]
  resources :items do
    member do
      patch :completed
    end
  end
end

schema.rb

ActiveRecord::Schema.define(version: 20150823054939) do

  create_table "items", force: :cascade do |t|
    t.string   "name"
    t.integer  "user_id"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
    t.boolean  "completed"
    t.datetime "expires_at"
    t.text     "description"
  end

  add_index "items", ["user_id"], name: "index_items_on_user_id"

  create_table "users", force: :cascade do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.string   "name"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.string   "confirmation_token"
    t.datetime "confirmed_at"
    t.datetime "confirmation_sent_at"
    t.string   "unconfirmed_email"
    t.datetime "created_at",                          null: false
    t.datetime "updated_at",                          null: false
    t.string   "role"
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true
  add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true

end

2 ответа

Решение

Если я правильно понял, проблема заключается в destroy метод. Так должно быть

def destroy
  if @item.days_left == 0
  @item.destroy
  end
  redirect_to items_path
end

Обновить:

Если вы хотите, чтобы элементы самостоятельно удалялись, вы можете использовать каждый раз, когда переходите к задаче, которая делает это, как показано ниже.

# lib/tasks/delete_expired_items.rake
every :hour do 
  runner "Item.delete_expired_items"
end

#item.rb
def delete_expired_items
  #this will delete the items that are created 7 days ago from today.
  self.where('created_at =?', 7.days.ago).destroy_all
end

Вам необходимо создать задачу, которая проверяет просроченные элементы и автоматически удаляет их. Посмотрите на https://github.com/collectiveidea/delayed_job.

В вашем коде действие уничтожения вызывается, только если пользователь хочет уничтожить элемент.

Другие вопросы по тегам