2017-04-30 9 views
0

こんにちは私はfindメソッドを使用してスキルを更新しようとしています。私は新しいスキルを作成することができますが、すでに存在するスキルを更新しようとするとスキルを更新しますが、同じデータでスキルが重複して作成されます。メソッドを作成して重複を作成する

def create 
    @project = Project.find params[:project_id] 
    @skills_required = @project.skills_requireds.new(skills_required_params) 
    skills = SkillsRequired.where(skills_required_params.slice(:skill_id)).first_or_create 
    skills.update(skills_required_params) 
    respond_to do |format| 
    if @skills_required.save  
     format.html{ redirect_to @project, notice: "Skills required added for #{@project.projectName}" } 
    else 
     format.html{ redirect_to @project, notice: "Something went wrong, unable to update required skills " } 
    end 
    end 
end 

フォーム:

<div class="section"> 
    <div class="top-border left"></div> 
    <div class="top-border right"></div> 
    <h3> Skill Required</h3> 
    <%= form_for([@project, SkillsRequired.new]) do |f| %> 
    <div class="field"> 
     <%= f.label :skill_id %><br> 
     <%= f.collection_select :skill_id, Skill.all, :id, :skillType, :prompt => "Select Skill" %> 
    </div> 
    <div class="field"> 
     <%= f.label :numWorkers %><br> 
     <%= f.number_field :numWorkers %> 
    </div> 
    <div class="field"> 
     <%= f.label :skillLevel %><br> 
     <%= f.text_field :skillLevel %> 
    </div> 
    <%=f.submit "Add Skill" %> 
    <%end%> 
</div> 

私はskills_requiredは私のコントローラに破壊する追加しようとしたが、これは私が新しいスキルを追加することはできません。どんな助けもありがたいです

+0

私はあなたの問題の根本を推測しているこれらの変数であります両方とも '@ skills_required'と' skills'を保存しています。 – burnettk

+0

このメソッドをcreateメソッドで呼び出すことは可能ですか?スキルが保存される前にスキルが存在するかどうかを確認する方法はありますか? – Parks

+0

ある変数に '.new(...)。save'を呼び出し、別の変数に' first_or_create'を呼び出しています。もちろん、それは2つのレコードを作成するつもりです:) –

答えて

0

問題が間違っています。ユーザーが同じスキルを指定できるようにしたいが、異なるレベルであなたがそうのようにそれを行うことができる場合

# Your model names should be nouns - not adjectives 
class SkillRequirement < ApplicationRecord 
    validates_uniqueness_of :skill_id, scope: :project_id' 
end 

:あなたはskill requirementsが有効であるか強制モデルレベルの検証を必要とする

# Your model names should be nouns - not adjectives 
class SkillRequirement < ApplicationRecord 
    validates_uniqueness_of :skill_id, scope: [:project_id, :level] 
end 

競合状態を避けるために、これをデータベースインデックスと組み合わせる必要があります。既存のスキル要件を更新して以来

add_index(:skill_requirements, [:project_id, :skill_id], unique: true, name: 'by_skill_and_project') 

はあなたのコントローラですべてが膨張を必要としない別々の更新アクションによって処理されるべきである:

class SkillRequirementsController 
    before_action :set_project 

    def create 
    @skill_requirement = @project.skill_requirements.new(skill_requirement_params) 
    if @skill_requirement.save 
     redirect_to @project 
    else 
     render :new 
    end 
    end 

    def update 
    @skill_requirement = @project.skill_requirements.find(params[:id]) 
    if @skill_requirement.update(skill_requirement_params) 
     redirect_to @project 
    else 
     render :edit 
    end 
    end 

    private 

    def set_project 
    @project = Project.find(params[:project_id]) 
    end 

    def skill_requirement_params 
    params.require(:skill_requirement).permit(:) 
    end 
end 
関連する問題