has_one / belongs_to 関連付けでリンクされている 2 つのモデルがあります。それぞれコンピューターと Ipv6Address。
Ipv6 テーブルに必要なすべてのエントリを事前に入力しました。次に、IPv6 から項目を選択して関連付けるために、コンピューターの新規/編集フォームにドロップダウン リストが必要です。
これについてこれまで見てきたことはすべて、新しいフォームで両方のオブジェクトを同時に作成し、その後それらを編集している場合にのみ機能するようです。
オンラインで見つけた例に従って MVC をセットアップしようとしましたが、これらのコードの抜粋の下にあるように、エラーが発生し続けます。
コンピュータモデル:
class Computer < ActiveRecord::Base
accepts_nested_attributes_for :ipv6_address
has_one :ipv6_address
...
Ipv6Address モデル:
class Ipv6Address < ActiveRecord::Base
attr_accessible :computer_id, :ip_address
belongs_to :computer
...
コンピュータコントローラ:
class ComputersController < ApplicationController
def new
@computer = Computer.new
@ipv6s = Ipv6Address.where('computer_id IS NULL').limit(5)
end
def edit
@computer = Computer.find(params[:id])
@ipv6s = Ipv6Address.where('computer_id = #{@computer.id} OR computer_id IS NULL').order('computer_id DESC').limit(5)
end
コンピュータの新しいフォーム:
<%= simple_form_for( @computer ) do |f| %>
<%= f.fields_for :ipv6_addresses do |v6| %>
<%= v6.input :ipv6_address, :collection => @ipv6s %>
<% end %>
<% f.button :submit %>
<% end %>
コンピュータの新しいフォームを参照する際のエラー:
NoMethodError in ComputersController#new
private method `key?' called for nil:NilClass
このエラーのコード参照はありませんが、コンピューターの新しいフォームにネストされたフォームが含まれている場合にのみ表示されます。
何が原因なのか、またはどうすれば自分がやっていることをよりうまく進めることができるのかについてのアイデアはありますか?
編集:
結局のところ、コンピューターモデルaccepts_nested_attributes_for :ipv6_address
のラインの後に必要でした。has_one :ipv6_address
これにより、フォームの読み込みに関する問題が修正されました。
Yarden の回答に従って、has_one 関係を反映するために、「ipv6_address」のすべてのインスタンスも個別化しました。
ただし、新しい形式でそれを行うと、ipv6 フィールドは完全に消えました。すぐに解決できない場合は、これで新しい質問を開きます。