我试图让人们直接更新记录,如果他们知道id或者输入名称/地址类型的信息,它会找到正确的记录,或者如果它不存在则创建一个新记录。
@donor = Donor.find_or_initialize_by_company_and_prefix1_and_first_name1_and_last_name1_and_address1(params[:donor])
只要输入的记录包含所有必要的列(如果我通过csv文件读取此信息,它将会是这样的话),上述工作就可以了。
但是现在我想提供仅包含ID的选项,如果它存在于数据库中则使用它。如果没有,我会运行上述语句来查找这些列或创建新记录。
我的控制器如下:
def create
# need to find donor by id if given, else use find_or_create_by_blahblahblah
@donor = Donor.find_or_initialize_by_company_and_prefix1_and_first_name1_and_last_name1_and_address1(params[:donor])
if @donor.new_record?
@donor.save
respond_to do |format|
if @donor.save
format.html { redirect_to @donor, notice: 'Donor was successfully created.' }
format.json { render json: @donor, status: :created, location: @donor }
else
format.html { render action: "new" }
format.json { render json: @donor.errors, status: :unprocessable_entity }
end
end
else
respond_to do |format|
if @donor.save
format.html { redirect_to @donor, notice: 'Donor already exists. Please edit donor if needed.'}
format.json { render json: @donor, status: :created, location: @donor }
else
format.html { render action: "new" }
format.json { render json: @donor.errors, status: :unprocessable_entity }
end
end
end
end
如果提供ID来检查它,我无法找到该怎么做。
我尝试过类似的事情:
@donor = Donor.find_by_id(params[:donor])
if !@donor
@donor = Donor.find_or_initialize_by_all_those_columns(params[:donor])
end
但如果我将数据放入公司字段而不是ID字段,这会给我一个错误。
我确信有一种光滑的方式可以做到这一点,我还没有看到。任何帮助都将不胜感激。
答案 0 :(得分:3)
如果记录已经存在,您通常会将表单提交路由到控制器的update
操作。
尽管如此,如果您想要处理create
操作中的情况,您只需要知道哪个参数具有捐赠者ID。我会猜测并说它可能params[:donor][:id]
。如果是这样,那么这将起作用:
@donor = Donor.find_by_id(params[:donor][:id])
查看表单参数以找出正确的名称。
答案 1 :(得分:3)
试试这个:
unless @donor = Donor.find_by_id(params[:donor][:id]) // returns `nil` if record not found
@donor = Donor.find_or_initialize_by_all_those_columns(params[:donor])
end
@donor.new_record? ...
第一行查找传入ID的记录。如果返回记录,则@donor
设置为该记录,并且该块不会运行。如果没有,那么它将返回nil
(因为这个原因,使用find_by_id()
代替find()
非常重要,因为如果没有找到记录,find()
会引发错误,并且将运行块,使用参数将@donor
设置为记录(新的或不是新的)。
希望这能回答你的问题。