0

在我的 Rails 应用程序表单中,我有以下用于多选的代码:

<div class="field">
  <%= f.label :frameworks %><br />
  <%= f.collection_select :framework_ids, Framework.all, :id, :name, {}, {:multiple => true}  %>
</div>

它在创建时运行良好,并且在编辑视图中正确显示了先前选择的框架。

但是当我提交一些其他更新的字段时,它会重复我数据库中的框架条目。

例如,如果我选择了“framework1”、“frameworks2”,更新后我在数据库“framework1”、“frameworks2”、“framework1”、“frameworks2”中,如果我再更新一次:“framework1”, “框架 2”、“框架 1”、“框架 2”、“框架 1”、“框架 2”。

那么我应该怎么做才能预防呢?

编辑: 控制器在这里:

@component = Component.find(params[:id])

    respond_to do |format|
        if @component.update_attributes(params[:component])
          @component.update_attribute(:numImages, @component.assets.size)
          @component.save

          format.html { redirect_to @component, notice: 'Component was successfully updated.' }
          format.json { head :no_content }
        else
          format.html { render action: "edit" }
          format.json { render json: @component.errors, status: :unprocessable_entity }
        end
    end

结尾

顺便说一句,像我一样更新 :numImages 是否正确?

4

1 回答 1

0

对于 numImages 更新(您的子问题),我建议在您的组件模型中使用 before_update 方法。

  before_update :set_numimages

  def set_numimages
    numImages = assets.size
  end

此外,您正在调用 update_attributes、update_attribute保存在 @component 上。这会调用三个保存操作。我建议你把它改成这个,看看问题是否仍然存在:

@component = Component.find(params[:id])  

respond_to do |format|
  if @component.update_attributes(params[:component])
    format.html { redirect_to @component, notice: 'Component was successfully updated.' }
    format.json { head :no_content }
  else
    format.html { render action: "edit" }
    format.json { render json: @component.errors, status: :unprocessable_entity }
  end
end
于 2013-01-08T12:52:56.533 回答