7

私は現在、車両を組み立てるフォームを持っています。車両モデルは最初は次のようになります。

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, modelmakeと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を使用してコントローラーアクションでネストされたフォームフィールドを除外しますか?

4

1 に答える 1

12

Hash#except:を使用して、不要なキーを削除できます。

@vehicle.update_attributes(params[:vehicle].except(:make, :model))
于 2012-08-31T12:01:40.237 に答える