【问题标题】:Ruby on Rails - how do I remove a post once a date has passed?Ruby on Rails - 日期过去后如何删除帖子?
【发布时间】:2015-02-13 14:06:13
【问题描述】:

我目前有一个使用 Ruby on Rails 构建的职位列表网站,在添加职位页面上,其中一个输入是申请日期/职位到期日期字段 ()。我需要添加代码,该代码将在该日期过去后从视图中删除整个列表。目前到期 dat 的输入字段只是一个文本输入,是否需要更改,如果需要如何更改?我是 Rails 新手,所以请原谅我的知识。

index.html.erb -

<% @jobs.each do |job| %>
        <div class="job">
            <h2><%= link_to job.position, job %></h2>
            <ul class="entry_list">
                <li>Posted on: <%= job.created_at.strftime("#{job.created_at.day.ordinalize} %B %Y") %></li>
                <li>Company: <%= job.company %></li>
                <li>Salary: <%= job.salary %></li>
                <li>Contract Type: <%= job.contract %></li>
                <li>City: <%= job.city %></li>
                <li>Applications in by: <%= job.expirydate %></li>
                <li>Job Type: <%= job.jobtype %></li>
            </ul>
        </div>
    <% end %>

new.html.erb -

<%= simple_form_for @job, html: { multipart: true } do |form| %>
  <h2>Job Position:</h2>
    <%= form.input :position, input_html: { maxlength: 60 }, placeholder: "Job Position", label: false %>
    <%= form.input :company, input_html: { maxlength: 60 }, placeholder: "Company name", label: false %>
    <%= form.input :salary, input_html: { maxlength: 60 }, placeholder: "Salary", label: false %>
    <%= form.input :contract, input_html: { maxlength: 60 }, placeholder: "Contract Type", label: false, collection: ['Full time', 'Part time', 'Internship'], prompt: "Contract Type" %>
    <%= form.input :city, input_html: { maxlength: 60 }, placeholder: "City", label: false %>
    <%= form.input :expirydate, input_html: { maxlength: 60 }, placeholder: "Expiry date", label: false %>
    <%= form.input :jobtype, input_html: { maxlength: 60 }, placeholder: "Job Type", label: false, collection: ['Advertising', 'Art Direction', 'Artworker', 'Copywriting', 'Digital Design', 'Digital Developer', 'Editorial', 'Graphic Design', 'Miscellaneous', 'Motion Design/Animation', 'PR and Marketing', 'Project Management', 'Studio Management'], prompt: "Job Type" %>
    <%= form.input :description, input_html: { maxlength: 60 }, placeholder: "Full job description", label: false %>
    <%= form.input :apply, input_html: { maxlength: 60 }, placeholder: "How to apply", label: false %>
    <h2>Your Contact Details:</h2>
    <%= form.input :contactname, input_html: { maxlength: 60 }, placeholder: "Contact Name", label: false %>
    <%= form.input :contactemail, input_html: { maxlength: 60 }, placeholder: "Contact Email", label: false %>
    <%= form.input :contactphone, input_html: { maxlength: 60 }, placeholder: "Contact Telephone", label: false %>
    <%= form.input :human_sum, label: 'What is 1+1?' %>
    <%= form.button :submit %>
<% end %>

jobs_controller.rb -

class JobsController < ApplicationController

respond_to :html, :js

def index
   @jobs = Job.page(params[:page]).per(20).order(created_at: :desc)
end

def new
   @job = Job.new
end

def show
   @job = Job.find(params[:id])
end

def create
   @job = Job.new(params.require(:job).permit(:human_sum, :position, :company, :salary, :companywebsite, :contract, :city, :expirydate, :jobtype, :description, :apply, :contactname, :contactemail, :contactphone, ))
    if @job.save
      redirect_to root_path
    else
      render "new"
    end
end

end

job.rb -

class Job < ActiveRecord::Base
  validates :position, presence: true
  validates :company, presence: true
  validates :salary, presence: true
  validates :companywebsite, presence: true
  validates :contract, presence: true
  validates :city, presence: true
  validates :expirydate, presence: true
  validates :jobtype, presence: true
  validates :description, presence: true
  validates :apply, presence: true
  validates :contactname, presence: true
  validates :contactemail, presence: true
  validates :contactphone, presence: true

  attr_accessor :human_sum 
  validate :not_a_bot

  private

  def not_a_bot
    if human_sum.to_i != 2 
      errors.add(:human_sum, 'Get out, you bot!') 
    end
  end

  scope :by_contract, -> (contracts) { where(:contract => (contracts|| Job.uniq.pluck(:contract)) ) }
  scope :by_jobtype, -> (jobtypes) { where(:jobtype => (jobtypes|| Job.uniq.pluck(:jobtype)) ) }

end

【问题讨论】:

  • 我建议您不要删除所有的职位发布数据,而是执行以下操作:编辑您的索引方法以显示发布时间
  • 啊,我明白了,你能告诉我如何使用我当前的设置来做到这一点吗?
  • 但如果所有工作申请日期都不同,那将如何运作?他们需要在一个月内全部展示吗?如果申请日期不是2个月,然后重新添加?

标签: ruby-on-rails ruby


【解决方案1】:

您可以将控制器中的索引操作更改为以下内容:

Model.find(:all, :conditions => [job.expirydate < Datetime.now])

如果你想删除旧记录,你可以为任务创建一个文件:

# lib/tasks/delete_old_records.rake
namespace :delete do
  desc 'Delete records older than 60 days'
  task :old_records => :environment do
    Model.where('created_at > ?', 60.days.ago).each do |model|
      model.destroy
    end

    # or Model.delete_all('created_at > ?', 60.days.ago) if you don't need callbacks
  end
end

运行:

RAILS_ENV=production rake delete:old_records

安排它使用 cron 运行(在本例中每天早上 8 点):

0 8 * * * /bin/bash -l -c 'cd /my/project/releases/current && RAILS_ENV=production rake delete:old_records 2>&1'

您还可以使用 [whenever][1] gem 在部署时创建和管理您的 crontab:

every 1.day, :at => '8:00 am' do
  rake "delete:old_records"
end

【讨论】:

    【解决方案2】:

    我会创建一个删除所有旧帖子的 rake 任务,然后定期从 cron 或其他调度程序运行它,例如每天凌晨 2 点。

    编辑 - 虽然,再看看你的问题,我不认为你真的想删除它们。我认为您只是不想在索引页面上显示它们。那里“删除”这个词的使用令人困惑:)

    【讨论】:

    • 只是一个快速的,如果他有其他依赖于工作的东西,例如属于工作的工作应用程序模型,那么他可能只想隐藏已经过期的那些。如果没有,那么删除它们的 cron 是一个很好的建议
    • 我认为他实际上并不想删除它们。我不会,如果它是我的应用程序,你会想保留它们以供将来参考。
    • 我明白了,抱歉,是的,我只是不希望它们在用户输入 的日期过去之后可见,我将如何实现这一点?
    【解决方案3】:

    要将显示限制为活动记录,请向模型添加范围:

    scope :current, -> { expirydate >= Date.current }
    

    并将其添加到您的控制器:

    @jobs = Job.current.page(params[:page]).per(20).order(created_at: :desc)
    

    【讨论】:

      【解决方案4】:

      2 件事:
      1) 只列出未过期的工作

      def index
         @jobs = Job.where('expirydate >= ?', Date.today).page(params[:page]).per(20).order(created_at: :desc)
      end
      

      2) 使用交互式日期选择器增强 expirydate 的文本输入。 内置日期选择器的 Rails 不是很好,因为它们不使用 javascript。根据您使用的 javascript 库,有很多解决方案。以 jquery 为例,请参阅http://jqueryui.com/datepicker/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-09
        • 1970-01-01
        • 2020-05-28
        • 1970-01-01
        • 1970-01-01
        • 2021-09-29
        • 1970-01-01
        相关资源
        最近更新 更多