4

fromrfid_tagを作成するフォームからを渡そうとしています。デバイス。はすでにデータベースに存在します。 devicehidden_fieldhas_many rfidsrfid

フォームのコードは次のとおりです。

<th>RFID Tag #</th>
<td>
  <%= f.label(:@passed_rfid_tag, @passed_rfid_tag) %>
  <%= f.hidden_field :rfid_tag, :value => @passed_rfid_tag %>
</td>
</tr>

これがdevices_controllerからのコードです:

def create
   @cabinet = Cabinet.find(params[:device][:cabinet_id])
   @device = Device.create(params[:device])
   @device.rfids << Rfid.where('rfid_tag' => params[:rfid_tag]).first
   @device.row_id = @cabinet.row_id
   @device.save

rfid_tagはの属性ではないため、次のエラーが発生しますdevice。これはの属性ですrfid

Can't mass-assign protected attributes: rfid_tag

app/controllers/devices_controller.rb:182:in `create'

ありがとう。

4

2 に答える 2

7

属性ハッシュ:rfid_tagの一部として渡すため、一括割り当てエラーが発生しています。params[:device]

サンプルコードでは、フォームヘルパー:rfid_tagを使用してフィールドを指定する必要があります。hidden_field_tagこれにより、params[:device]ハッシュに含まれなくなります。

<tr>
  <th>RFID Tag #</th>
  <td>
    <%= label_tag 'rfid_tag', 'RFID Tag' %>
    <%= hidden_field_tag 'rfid_tag', @passed_rfid_tag %>
  </td>
</tr>

その後、を介してアクセスできますparams[:rfid_tag]。あなたのcreate方法はまだ機能するはずです。

于 2013-03-14T20:17:30.153 に答える
3

Dan Reedy が言ったことを実行し、フォームで hidden_​​field_tag を使用します。

コントローラーの create メソッドの次の行が気になります。

@device.rfids << Rfid.where('rfid_tag' => params[:rfid_tag]).first

あなたのrfidにも多くのデバイスがあり、多対多の関係がある場合は良いことです。rfid タグがちょうど 1 つのデバイスに対応している場合は、おそらく次のように変更する必要があります。

rfid = Rfid.where('rfid_tag' => params[:rfid_tag]).first
rfid.device_id = @device.id
rfid.save!

そしてもちろん、params ハッシュから取得したキャビネット ID または rfid_tag がデータベースで見つからない場合にも必ず対処してください。非表示フィールドからのものであっても、ユーザーが提供した入力が有効であるか、実際のレコードに対応しているとは期待できません。

于 2013-03-14T20:34:24.793 に答える