Rails查找并重定向或创建

时间:2013-06-08 19:13:24

标签: ruby-on-rails

我正在尝试在我的模型中设置一个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

感谢。

1 个答案:

答案 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]的逻辑,并确保不会对无效输入进行轰炸,但这是要点。