簡體   English   中英

如何每 24 小時更改 Rails 應用程序中的圖像?

[英]How do I change the images in a rails app every 24 hours?

我有一個包含 6 張圖片的畫廊的 Rails 應用程序。 我想每 24 小時自動切換顯示哪些圖像。 我有在 rake 任務中選擇圖像的邏輯,它返回 @todays_paper 的實例變量:

namespace :images do
  desc "TODO"
  task next_batch: :environment do
    all_newspapers = Newspaper.all
    filtered_newspapers = all_newspapers.select { |newspaper| newspaper.done == false }
    @todays_paper = filtered_newspapers.first
    @todays_paper.done = true
    @todays_paper.save
    return @todays_paper
  end
end

我的問題是,如何將 @todays_paper 實例變量傳遞給 controller,從而傳遞給視圖? 如果我在 controller 操作中調用它,即使我使用 Whenever 或 Sidekiq 每 24 小時運行一次,它仍然會在每次調用 controller 操作時運行,我想。

我不知道這是否是錯誤的方法 - 但我想不出除了使用后台作業之外的另一種安排這種情況發生的方法。 我可以使用 Newspaper class 方法,也許可以調用它嗎?

選項 1:每天運行一次cron 作業 一個流行的庫是clockwork

可以通過發條觸發 cron 作業......或者不......這是一個由你決定的實現細節,但基本上:你需要它來做這樣的事情:

every(1.day, 'Update live newspaper', at: '00:00') do
  current_newspaper = Newspaper.find_by(live: true)
  next_newspaper = Newspaper.find_by(done: false)

  current_newspaper.update_attributes({live: false})
  next_newspaper.update_attributes({live: true, done: true})
end

然后在 controller 中,獲取:

@live_newspaper = Newspaper.find_by(live: true)

請注意,我在newspapers表上假設了第二個屬性( live ); 否則無法識別。

正如我所說,您可以將上面的代碼移動到作業、rake 任務或其他任何東西中——並從調度程序中調用它——而不是將所有代碼都寫成內聯。 隨你(由你決定。


選項 2:或者,您可以通過每天有人瀏覽網站時自動輪換報紙來做一些聰明的事情。

例如,如果不是將done用作boolean字段,而是將其live_on日期字段會怎么樣? 然后你可以在 controller 中做這樣的事情:

@current_newspaper = Newspaper.find_by(live_on: Date.today) || set_todays_newspaper

...

def set_todays_newspaper
  newspaper = Newspaper.find_by(live_on: nil)
  newspaper.update_attributes({live_on: Date.today})
  newspaper
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM