1

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 フィールドは完全に消えました。すぐに解決できない場合は、これで新しい質問を開きます。

4

1 に答える 1

0

「:」を追加してみてください。それが問題かもしれません:

 <%= f.fields_for :ipv6_addresses do |v6| %>

また、「.」を追加するのを忘れました。ここ:

@ipv6s = Ipv6Address.where('computer_id IS NULL').limit(5)

変更後の編集:

問題は、 has_one 関係のみであるため、モデルで述べたように :ipv6_address の複数形がわからないことです... :ipv6_addresses ではなく :ipv6_address に変更する必要があります...

また、フォームで :ipv6_address を実際のフィールドである :ip_address に変更します。

したがって、全体として、フォームは次のようになります。

<%= simple_form_for( @computer ) do |f| %>
<%= f.fields_for :ipv6_address do |v6| %>
<%= v6.input :ip_address, :collection => @ipv6s %>
<% end %>
<% f.button :submit %>
<% end %>
于 2012-09-16T08:33:57.660 に答える