2012-08-31 6 views
6

私は現在、ビークルを構築するフォームを持っています。あなたは何make_idmodel_id列が存在しないことに注意しますフォームを送信するときにフィールドを無視する

class Vehicle < ActiveRecord::Base 
    attr_accessible :trim_id 

    belongs_to :trim 
end 

;:車両モデルは、当初のようになります。トリムはモデルに属し、モデルはメイクに属しているため、これらは必要ではないため、車両モデルに格納する必要はありません。

車両のフォームに問題が発生します - リンクされた選択肢がいくつかあります。ここでメイクを選択し、次にモデルを選択し、トリムを選択します。私は新しい車を作成していた場合、次のコードは正常に動作します:

<%= select("", "", Make.all.collect {|p| [ p.value, p.id ] }, {:prompt => 'Select Make'}, {} %> 
<%= f.select("", "", options_for_select([]), {:prompt => 'Select Model'}, {} %> 
<%= f.select(:trim_id, options_for_select([]), {:prompt => 'Select Trim'} %> 

あなたが注意するように、製造元とモデルを選択するには、フォームパラメータを持っていないので、無視されます。これは正常に動作し、車両は正しく保存されます。

この車両を編集したいときに問題が発生します。メイクとモデルダミーはトリムに連鎖することを選択するため、最初は編集中の車両の製造元とモデルではなく、デフォルト値に設定されます。その結果、私が見えるように、私のモデルを更新しました:

class Vehicle < ActiveRecord::Base 
    attr_accessible :trim_id 

    belongs_to :trim 
    has_one :model, :through => :trim 
    has_one :make, :through => :model 
end 

とにフォームを更新:期待されるよう

<%= f.select(:make, Make.all.collect {|p| [ p.value, p.id ] }, {:prompt => 'Select Make'}, {} %> 
<%= f.select(:model, options_for_select([]), {:prompt => 'Select Model'}, {} %> 
<%= f.select(:trim_id, options_for_select([]), {:prompt => 'Select Trim'} %> 

しかし、製造元とモデルではないため、これは、Can't mass-assign protected attributes: make, modelになりattr_accessible(とにかくmakeとmodelの列は存在しません)。

私の質問は、新しい車両フォームを送信する際にこれらのフィールドを無視する方法ですが、車両の編集中でも正しい値を選択させる方法はありますか?

ありがとうございます!

EDIT:次のようにBeerlingtonからの回答ごとに、私は私のcreateアクションを更新しました:

def create 
    @sale = Sale.new 
    current_ability.attributes_for(:new, Sale).each do |key, value| 
     @sale.send("#{key}=", value) 
    end 
    @sale.update_attributes(params[:sale].except("date")) 
    authorize! :create, @sale 
    if @sale.save 
     redirect_to @sale, :notice => "Successfully created sale." 
    else 
     render :action => 'new' 
    end 
end 

あなたが、私はここに「日付を」以外のしようとしていますので注意します(も試してみました:日付) - このネストされていない属性でテストすることでした。

しかし、日付がまだ提出されていることを確認しています。誰かがHash#を使用してコントローラの完全な操作を支援することはできますか?

EDIT 2:それは元の質問に答えとして私は、正しいようBeerlingtonの答えをマークしている - 私はここで、フォローアップの質問求めている:あなたはHash#exceptを使って、必要とされていないキーを削除することができますExcluding nested form fields in controller action with Hash#exclude before mass_assignment error is generated?

答えて

12

を:

@vehicle.update_attributes(params[:vehicle].except(:make, :model)) 
+0

ありがとうございます、それはうまくいくようです - ネストされた属性を除外する方法を更新することができますか? vehicles_attributes"=>{"0"=>{"make"=>""}に入りますか?ありがとう! –

+0

これは元の質問に答え、私を正しい軌道に乗せるため、答えとしてマークされています。 –

関連する問題