我正在尝试在我的模型中设置一个Create动作,它首先检查数据库中是否已存在基于我所拥有的参数的对象。如果有,我想重定向到该对象的显示页面。如果没有,我想使用参数创建一个对象。我怎么做这个以及最好的'Rails方式'来实现它?我尝试了find_or_create_by,但最终我的数据库中出现了重复的条目,这正是我想要避免的。
到目前为止,这是我的创建动作:
def create
@book = Book.new(book_params)
if @book.save
redirect_to @book
else
# do something else
end
end
我设置了这样的参数:
def book_params
params.require(:book).permit(:title, :author, :isbn, :description)
end
我还有一个唯一性验证:isbn。
validates :isbn, presence: true, length: { is: 13 }, uniqueness: true, numericality: true
感谢。
答案 0 :(得分:0)
在执行查询的before_filter
之前运行的create
,然后重定向。
class BooksController < ApplicationController
before_filter :check_for_existing_book, :only => [:create]
def create
# your existing create logic here
end
private
def check_for_existing_book
book = Book.where(:isbn => params[:book][:isbn]).first
if book
redirect_to(book) and return
end
end
end
您可能希望清理检查params[:book][:isbn]
的逻辑,并确保不会对无效输入进行轰炸,但这是要点。