我的表单正在创建一个新记录,但我希望它先检查user_id是否存在,如果存在则发送更新。
我在编辑网页中的表单:
<%= form_for @trained, :url => certificates_path, :method => :post do |f| %>
<p> Non-Trained Users </p>
<%= select_tag "certificate[user_id]", options_for_select(@non_trained.collect{|x| [x.name, x.id]}), {:multiple => :multiple} %>
<%= f.submit "Train", class: "btn btn-large btn-primary" %>
<% end %>
我在控制器中的edit(),似乎忽略了我的if语句,如果找不到记录,则会出错。我如何首先检查现有记录,然后将其发送到update()?
if @trained = Certificate.find(params[:certificate])
else
@trained = Certificate.new(params[:certificate])
end
这是我的资源控制器,实际上正在执行工作。
class CertificatesController < ApplicationController
def create
@trained = Certificate.new(params[:certificate])
if @trained.save
@trained.update_attributes(attend: "Yes")
end
redirect_to grandstreamers_resellers_path
end
def update
@trained = Certificate.where(user_id: params[:certificate][:user_id])
@trained.first.update_attributes(attend: "No")
@untrained = Certificate.where(user_id: params[:certificate][:user_id])
@untrained.first.update_attributes(attend: "No")
redirect_to grandstreamers_resellers_path
end
end
如果不作为条件语句的一部分执行变量赋值,我通常会倾向于寻找代码清理器。但是,如果要避免在初次查找之后进行第二次分配,可以按以下步骤进行。
我建议更改这些行:
if @trained = Certificate.find(params[:certificate])
else
@trained = Certificate.new(params[:certificate])
end
像这样:(注意参数的变化……您应该使用ID或其他属性来查找证书,而不是使用整个参数的哈希值)
@trained = Certificate.find_by_id(params[:id]) || Certificate.new(params[:certificate])
当然,您也可以使用该find_or_create_by
方法...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句