Ruby on rails Rails查找并重定向或创建

Ruby on rails Rails查找并重定向或创建,ruby-on-rails,Ruby On Rails,我试图在我的模型中设置一个Create操作,它首先根据我拥有的参数检查数据库中是否已经存在一个对象。如果有,我想重定向到该对象的显示页面。如果没有,我想使用参数创建一个对象。我将如何做到这一点?实现这一点的最佳“Rails方式”是什么?我试图通过查找或创建,但最终在我的数据库中出现了重复条目,这正是我试图避免的 以下是我迄今为止的创建操作: def create @book = Book.new(book_params) if @book.save redirect_to @bo

我试图在我的模型中设置一个Create操作,它首先根据我拥有的参数检查数据库中是否已经存在一个对象。如果有,我想重定向到该对象的显示页面。如果没有,我想使用参数创建一个对象。我将如何做到这一点?实现这一点的最佳“Rails方式”是什么?我试图通过查找或创建,但最终在我的数据库中出现了重复条目,这正是我试图避免的

以下是我迄今为止的创建操作:

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

谢谢。

在您的
创建
之前运行的
前过滤器
,它执行查询,然后重定向出去

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
class BooksController[:create]
def创建
#您现有的创建逻辑在这里
结束
私有的
def检查现有书籍
book=book。其中(:isbn=>params[:book][:isbn])。首先
如果书
将_重定向到(book)并返回
结束
结束
结束

您可能希望清理检查
参数[:book][:isbn]
的逻辑,并确保不会对无效输入进行轰炸,但这是要点。

非常感谢!太好了。我正在建立一个类似的私有方法,但无法使其工作。我没有想到要使用before_动作。还有一件事需要注意:我正在rails 4上构建,所以我必须使用…进行轻微调整。。。在采取行动之前:检查现有的书籍,只有:[:创建]@CodyCaughlan“唯一性”逻辑应该存在于模型中吗?@fengd是的,我认为是的,如果它对应用程序有意义,并且在本例中看起来是这样的话。我可能会做两件事:1)在模型中保留
的validates\u university\u,2)在数据库中的
books.isbn
上添加唯一索引。