Ruby on Rails:在某些情况下无法更新表条目

时间:2012-10-23 14:04:27

标签: ruby-on-rails ruby controller

我有一个应用程序,允许用户在名为Projects的表中输入和编辑项目。其中一个字段允许他们检查该项目的技术。它们存储在名为Technols的单独表中,表之间的关系称为Projecttechnols。

作为一个例子,我有一个Project X,它有很多技术,tech1,tech2和tech3。如果我编辑项目,我可以删除或添加技术到项目,并随意更新项目。当我尝试将所有项目从项目中取出时,我的问题就开始了。如果我试试这个,没有任何改变,技术保持不变。

创建一个没有技术的新项目我没有问题,我可以通过插入技术重新进入该项目并进行编辑,但是如果我再次添加技术再次编辑它,并尝试将它们全部删除。没有任何事情发生。

以下是项目控制器的新动态,编辑,创建和更新操作:

def new
  @project = Project.new
  @technol = Technol.new(params[:tech])

  @all_technols = Technol.all

  @project_technol = @project.projecttechnols.build

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @project }
  end
end

# GET /projects/1/edit
def edit
  @project = Project.find(params[:id])
  @project_technol = @project.projecttechnols.build

  puts @project.inspect
  puts @project.technols.inspect
end

# POST /projects
# POST /projects.json
def create  
  @project = Project.new(params[:project])
  @project.client = params[:new_client] unless params[:new_client].blank?
  @project.role = params[:new_role] unless params[:new_role].blank?
  @project.industry = params[:new_industry] unless params[:new_industry].blank?
  @project.business_div = params[:new_business_div] unless params[:new_business_div].blank?

  if !params[:technols].nil?
    params[:technols][:id].each do |tech|
      if !tech.empty?
        @project_technol = @project.projecttechnols.build(:technol_id => tech) 
      end
    end
  end

  respond_to do |format|
    if @project.save
      format.html { redirect_to @project, notice: 'Project was successfully created.' }
      format.json { render json: @project, status: :created, location: @project }
    else
      format.html { render action: "new" }
      format.json { render json: @project.errors, status: :unprocessable_entity }
    end
  end
end

# PUT /projects/1
# PUT /projects/1.json
# PUT /projects/1
# PUT /projects/1.json
def update
  @project = Project.find(params[:id])

  puts @project.inspect
  puts @project.technols.inspect

  params['project'][:client] = params[:new_client] unless params[:new_client].blank?
  params['project'][:role] = params[:new_role] unless params[:new_role].blank?
  params['project'][:industry] = params[:new_industry] unless params[:new_industry].blank?
  params['project'][:business_div] = params[:new_business_div] unless params[:new_business_div].blank?              

  respond_to do |format|
    if @project.update_attributes(params[:project])
      format.html { redirect_to @project, notice: 'Project was successfully updated.' }
      format.json { head :no_content }
    else
      format.html { render action: "edit" }
      format.json { render json: @project.errors, status: :unprocessable_entity }
    end
  end
end

以下是我对技术位的编辑视图:

<div class="tech" STYLE="text-align: left;">
  <b>Technologies:</b>
  <style>
    .split { text-align:left; }
  </style>   

  <p>
    <ul>
      <% for technol in Technol.all %> 
        <li class="split"> 
          <%= check_box_tag "project[technol_ids][]", technol.id,  @project.technols.include?(technol) %> 
          <%= technol.tech %> 
        </li>
      <% end %> 
    </ul>
  </p>

我是Rails的新手,所以它可能非常简单。所有帮助将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:1)

您的更新操作中没有任何代码可以添加/删除关联。如果params [:technol_ids]与该项目的数据库中的不同,则需要相应地添加/删除这些记录。

我看一下本指南 - http://guides.rubyonrails.org/association_basics.html, 特别是他们删除和创建关联的前几个例子。

答案 1 :(得分:1)

如果用户取消选中所有project[technol_ids][]复选框,则该字段根本不会显示在params中。必须至少选中一个复选框才能显示该字段。所以希望你能理解模型为什么不改变任何projecttechnol记录。

要解决此问题,请确保在update操作的顶部为该参数存储了某些

params[:project][:technol_ids] ||= []

如果没有选中复选框,这可确保您有一个空数组。将空数组传递到模型中应该清除所有存在的记录。