控制器检查记录是否存在,如果存在则发送到update()

时间:2014-01-03 22:03:55

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord html-select

我的表单正在创建一条新记录,但我希望它先检查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

1 个答案:

答案 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方法...