2016-05-30 9 views
0

すべてがうまくいきましたが、コードを変更したいのアクションをの更新のようなアクションに作成します。現在、作成アクションでは、すべての値をループして保存していますが、1行に収めたいと思っています。Railsのネストされたフォーム - リファクタリングの作成アクション|繭の宝飾

私はカレッジモデルを持っています。

class College< ActiveRecord::Base 
    has_many :staffs, dependent: :destroy 
    accepts_nested_attributes_for :staffs, reject_if: :all_blank, allow_destroy: true 
end 

そして、これが

class Staff < ActiveRecord::Base 
    belongs_to :college 
end 

私Staff.rbであり、これらは、これらが強いパラメータ

あり 更新を作成アクション

def create 
    @college= College.find(params[:college][:id_college_profile] 
) 
    staff_params = params[:college][:staffs_attributes].values 
    staff_params.each do |staff_param| 
    @staff = @college.staffs.new 
    @staff.name = staff_param[:name] 
    @staff.designation = staff_param[:designation] 
    @staff.experience = staff_param[:experience] 
    @staff.specialization = staff_param[:specialization] 
    @staff.save 
    end 
    redirect_to dashboard_path(id: @college.id), notice: "Successfully added Staff." 
end 

def update 
    @college= College.find(params[:college][:id_college] 
) 
    @college.update_attributes(staff_parameters) 
    redirect_to root_path 
end 

私のスタッフコントローラです

すべての値をループせずにすべてのスタッフを作成アクションに保存する方法はありますか?更新アクションのように1行のコードですべてを保存しますか?

は、私はアクション

def create 
    @college= College.find(params[:college][:id_college] 
) 
    @staff= @college.staffs.new(staff_parameters) 
    @staff.save 

    redirect_to dashboard_path(id: @college.id), notice: "Successfully added Staffs." 
end 

を作成StaffsControllerでこれを試してみました。しかし、誰かが親切にこの問題で私を助けることができるそれが

unknown attribute 'staffs_attributes' for Staff. 

このエラーを投げましたか?

答えて

1

これはCollegesControllerなので、createアクションでも新しい大学が作成されるとしますか?

ので、その場合には、あなたの作成アクションは、単にのようなものでなければなりません:

def create 
    @college = College.new(staff_parameters) 
    if @college.save 
    # succesfully created 
    else 
    # there was a validation error 
    end 
end 

ルート要素がcollegeであり、あなたがネストされたスタッフを編集するだけでなく、だけでなくので、一般的に、我々はcollege_parametersを使用することに注意してくださいおそらく大学の属性。

(あなたがfindをやっているので)大学は、常に既に存在する場合、差がcreateupdateの間で、なぜ常にその場合のeditアクションをレンダリングしていないものを私に少し混乱しているのですか?

私はdemo-projectショーケースの繭とネストされた属性を持っています。

+0

ありがとう。ここに流れがあります。ユーザーがサインアップします。彼はフォームにリダイレクトされます。それを提出すると、そのユーザーの大学オブジェクトが作成されます。この大学のオブジェクトにはスタッフ、コースなどがあります。 スタッフのコントローラでは、その特定の大学のスタッフを作成しています。私が投稿した作成アクションはStaffsControllerにあります。 – Mahendhar

+0

その場合、あなたは常に大学のためのフォームをレンダリングし、大学を保存するので、編集と新しいアクションの間に違いはありませんか? 1人のスタッフを作成したり編集したりすることはないので、潜在的にあなたのルートに混乱を招くことがあります。だから、私の場合、大学のコントローラーは、もう少し「標準的」な面倒を感じています。 – nathanvda

+0

ありがとう@nathanvda。私は、新しいものと編集するための編集フォームをレンダリングしています。コードをCollegesControllerに移動します。小さな質問。私はまた、「職員」のような大学のための「コース」を持っています。 colleges#createの場合、ネストされたコースフォームを編集するときにも 'course_parameters'を許可するように、強力なパラメータを変更する方法は '@ college.update_attributes(staff_parameters)'です。 – Mahendhar

0

これはさまざまな方法で行うことができます。 "staff_parameters"メソッドは、作成アクションではクラスStaffで、更新アクションではカレッジクラスで呼び出すため、エラーが発生しました。あなたがしたいことをする最も簡単なことは、スタッフのパラメータメソッドの強力なパラメータをコピーし、それを複製することです。この2番目のメソッドcreate_staffに名前を付け、 "params.require(:college)"の部分を "params.require(:staff)"に変更し、残りの部分を同じままにします。次に、作成アクションでは "college.staff(create_staff)"を実行できます。 Imは私の電話に書式設定isnt良いlol私は引用符でコードを入れたので。

+0

入力していただきありがとうございますが、エラーがあります。 'デフcreate_staff params.require(:スタッフ).permit(staffs_attributes:[:ID:名前:専門:経験、:名称:_destroy]) end'このコードはこのエラーを投げています ' paramが欠落しているか、値が空である:staff' – Mahendhar

+0

をここにいるのparamsを私はフォームが '{ "UTF8"=> "✓"、 "authenticity_token"=> "2JTUGSxkviYutVSkbmsNHfkAlHoxTOk70OPxsDTcyKlUKVFMJx5 + xF9RU6sZiXwIQqfNmOpw1NqnjJzJtrTHXQ =="、「大学に提出されたとき"=" {"staffs_attributes" => {"1464614354720" => {"name" => "asdasd"、 "specialization" => "asdasd"、 "designation" => "asdasd"、 "experience" => "12 "、" _destroy "=>" false "}}、" id_college "=>" 2 "}、"コミット "=>"保存 "、"コントローラ "=>"スタッフ "、"アクション "=>"作成 "} ' – Mahendhar

+0

作成アクションでは、私はこれを '@staff = @ college.staffs.new(create_staff)' – Mahendhar

関連する問題