2016-04-05 12 views
0

ネストされたフォームの関連付けでNotFound例外をエスケープする必要があります。例えばRails 4:エスケープが見つかりません。ネストされたフォームのエラー

、私は

class User < ActiveRecord::Base 
    has_many :user_selection_criteria 
    accepts_nested_attributes_for :user_selection_criteria, :reject_if => lambda { |t| t['brand_id'].nil? }, :allow_destroy => true 
end 

属性を更新
if @user.update_attributes user_params 
    render 
else 
    render json: @user.errors, status: :unprocessable_entity 
end 

を持って、paramsがこれを許可します、すべてがOKです。

私はネストされたフォームを、例えばそれらの属性で使用します。など

user_selection_criteria_attributes[0][id]  
user_selection_criteria_attributes[0][brand_id]  
user_selection_criteria_attributes[0][_destroy] 
user_selection_criteria_attributes[1][id]  
user_selection_criteria_attributes[1][brand_id]  
user_selection_criteria_attributes[1][_destroy] 
user_selection_criteria_attributes[2][id]  
user_selection_criteria_attributes[2][brand_id]  
user_selection_criteria_attributes[3][_destroy] 

...

すべてがOKですが、私:

  • 残すID空白 - 新しいレコードが既存のレコードの

  • 使用IDが作成されます - 対応レコードが更新されます。ユーザーのための

しかし、別のユーザーが既にこのレコードを削除したとき、私は、例えば、非既存のレコードのidを使用する場合、私はtはIDとUserSelectionCriterium見つけるCouldn 'エラーを取得= 13 IDを持つ= 12

私は

begin 
    if @user.update_attributes user_params 
    render 
    else 
    render json: @user.errors, status: :unprocessable_entity 
    end 
escape 
    render 
end 

を使用するとエラーがエスケープされていますが、属性は保存されません。しかし、それは期待されている。

質問:エラーをスケルチ/エスケープするには、そのレコードは無視され、他の有効な関係は保存されません。

I.e. id 13とのネストされた関係は存在しないが、id 14との関係が存在する場合、関係13は無視され、14は正常に処理される。

+0

、多くの場合、どのように起こるとするということである可能性がどのように?個人的に私は気にしません。 'find_by(id:...)'のようなエラーを起こさないファインダを使用し、検証エラーを返します。 – Mohamad

答えて

1

あなたがレコードのこれらのIDをフィルタリングすることができますが(理想的には、独自のコードを使用して)このように、exsitedしません:

def some_params 
    params.require(:user).permit(user_selection_criteria_attributes: [:id, :brand_id]).tap do |white_list| 
     white_list[:user_selection_criteria_attributes].each do |key, value| 
     if value[:id].present? && UserSelectionCriteria.find_by(id: value[:id]).blank? 

      white_list[:user_selection_criteria_attributes].delete(key) 
     end 
     end 
    end 
    end 
+0

あなたが忘れてしまった)前に。タップ ありがとう、それは素晴らしい仕事。 –

関連する問題