我承认我并不确切地知道为什么before过滤器是(或者即使是)处理我的问题的最佳方法,但是一个比我更了解Rails编程的开发人员告诉我它是。所以我要试着让它成功!
所以我要做的是检查数据库中最新的书是否在7天前或更早创建,如果是,创建一个新的。
下面是我的books控制器当前的样子:
class BooksController < ApplicationController
before_filter :check_seven_days, :only => [:create]
...
def create
@book = Book.new(params[:book])
respond_to do |format|
if @book.save
format.html { redirect_to user_url(@book.user), notice: 'Book was successfully added to your queue.' }
format.json { render json: @book, status: :created, location: @book }
else
format.html { render action: "new" }
format.json { render json: @book.errors, status: :unprocessable_entity }
end
end
end
...
protected
def check_seven_days
@user = User.find(params[:id])
@not_queued_books = @user.books.not_queued
@not_queued_books.each do |book|
Book.new if book.created_at >= 7.days.ago
end
end
end
然而,这并不完全有效…在所有。before过滤器中的代码或多或少是伪代码。我们这么称呼它是因为我还在学习如何正确地编写Ruby !但希望你能明白我在做什么:)
同样,你可以看到这是从哪里来的,我在模型中使用范围来检查一本书是否超过25秒前被添加:
scope :queued, lambda { where('created_at > ?', 25.seconds.ago) }
scope :not_queued, lambda { where('created_at <= ?', 25.seconds.ago) }
scope :date_desc, order("created_at DESC")
同样,视图循环(在用户显示视图中)看起来像这样:
<% @not_queued_books.date_desc.each do |book| %>
<%= book.title %>
<%= book.author %>
<% end %>
书。new将实例化一个新的Book对象,不保存也不带任何参数;你的意思是:
Book.create(params[:book])
?