0

ユーザーが Projects というテーブルでプロジェクトを入力および編集できるアプリがあります。フィールドの 1 つで、そのプロジェクトの技術を確認できます。これらは Technols という別のテーブルに格納され、テーブル間の関係は Projecttechnols と呼ばれます。

例として、tech1、tech2、tech3 という多くのテクノロジを含むプロジェクト X があります。プロジェクトを編集する場合は、テクノロジーをプロジェクトから削除または追加し、プロジェクトを自由に更新できます。しかし、すべてのプロジェクトをプロジェクトから外そうとすると、私の問題が始まります。これを試してみても、何も変わらず、テクノロジーは同じままです。

テクノロジーなしで新しいプロジェクトを作成しても問題ありません。そのプロジェクトに戻ってテクノロジーを挿入して編集できますが、テクノロジーを追加してもう一度編集し、それらをすべて削除しようとします。何も起こりません。

プロジェクトコントローラーからの私の新しい、編集、作成、および更新アクションは次のとおりです。

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を初めて使用するので、非常に単純なものかもしれません。すべての助けをいただければ幸いです。前もって感謝します。

4

2 に答える 2

1

ユーザーがすべてのproject[technol_ids][]チェックボックスをオフにすると、そのフィールドはまったく表示さparamsれません。フィールドを表示するには、少なくとも 1 つのチェックボックスをオンにする必要があります。projecttechnolモデルがどのレコードも変更しない理由を理解していただければ幸いです。

これを修正するには、アクションの上部にあるパラメーターに何かが保存されていることを確認してください。update

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

これにより、チェックボックスがチェックされていない場合、空の配列が確保されます。空の配列をモデルに渡すと、存在するすべてのレコードが消去されます。

于 2012-10-23T14:20:49.397 に答える
1

関連付けを追加/削除するための更新アクションにコードがあるようには見えません。params[:technol_ids] がそのプロジェクトのデータベースにあるものと異なる場合は、それに応じてそれらのレコードを追加/削除する必要があります。

このガイド ( http://guides.rubyonrails.org/association_basics.html ) 、特に関連付けを削除および作成する最初のいくつかの例を参照してください。

于 2012-10-23T14:16:53.253 に答える