我的表单正在创建一条新记录,但我希望它先检查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 %>
我在编辑器中的编辑(),它似乎忽略了我的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
答案 0 :(得分:1)
如果变量赋值不作为条件语句的一部分执行,我通常倾向于找到代码更清晰。但是,如果您想在初始查找后避免第二次分配,可以按照以下步骤进行操作。
我建议改变这些行:
if @trained = Certificate.find(params[:certificate])
else
@trained = Certificate.new(params[:certificate])
end
对于这样的事情:(注意params的变化......你应该使用ID或其他属性找到证书,而不是整个params哈希)
@trained = Certificate.find_by_id(params[:id]) || Certificate.new(params[:certificate])
当然,您也可以使用find_or_create_by
方法...