私は現在、車両を組み立てるフォームを持っています。車両モデルは最初は次のようになります。
class Vehicle < ActiveRecord::Base
attr_accessible :trim_id
belongs_to :trim
end
make_id
またはmodel_id
列がないことに注意してください。トリムはモデルに属し、モデルはメーカーに属しているため、これらは必須ではありません。したがって、これらは車両モデルに格納する必要はありません。
問題は車両フォームで発生します-私はいくつかのリンクされた選択を持っています、そこで私はメーカー、モデル、そしてトリムを選択することができます。新しい車両を作成するときは、次のコードが正常に機能します。
<%= 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'} %>
お気づきのように、makeとmodel selectにはフォームパラメータがないため、無視されます。これは正常に機能し、車両は正しく保存されます。
この車両を編集したいときに問題が発生します。makeとmodelは、トリムにチェーンするために単にダミー選択するため、編集中の車両のmakeとmodelではなく、最初はデフォルト値に設定されます。その結果、モデルを次のように更新しました。
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
makeとmodelはattr_accessibleではないため(いずれの場合もmakeとmodelの列は存在しません)、これは結果になります。
私の質問はこれです:新しい車両フォームを送信するときにこれらのフィールドを無視する方法はありますが、車両が編集されているときに正しい値を選択させる方法はありますか?
ありがとう!
編集: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
ここで「date」を除外しようとしていることに気付くでしょう(:dateも試しました)-これは、ネストされていない属性でテストするためのものでした。
しかし、その日付はまだ提出されていることがわかりました-誰かがHash#exceptを使用して完全なコントローラーアクションを支援できますか?
編集2:元の質問に答えたので、Beerlingtonの答えを正しいとマークしました-ここでフォローアップの質問をしました:mass_assignmentエラーが生成される前にHash#excludeを使用してコントローラーアクションでネストされたフォームフィールドを除外しますか?