has_one / belongs_to 関連付けでリンクされている 2 つのモデルがあります。それぞれコンピューターと Ipv6Address。
Ipv6Address テーブルに必要なすべてのエントリを事前に入力しました。次に、IPv6 からアイテムを選択して関連付けるために、Computer new/edit フォームにドロップダウン リストが必要です。これを事前設定する必要がある理由は、コンピューターが関連付けることができる事前定義された IPv6 の範囲が存在するためです。私は、エンド ユーザーがリストから何かをやみくもに選択できるようにしたいと考えています。彼らがそれをしている理由を理解すること。しかし、それが何であるかを知っている人なら誰でも、好きなものを選ぶ機会を与えてください.
これまで見てきたことはすべて、新しいフォームで両方のオブジェクトを同時に作成し、その後それらを編集している場合にのみ機能するようです。
オンラインで見つけた例に従って MVC をセットアップしようとしましたが、同様のトピックに関する他のスタックオーバーフローの質問をチェックアウトしました。
コンピュータモデル:
class Computer < ActiveRecord::Base
has_one :ipv6_address
accepts_nested_attributes_for :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_address do |v6| %>
<%= v6.input :ipv6_address, :collection => @ipv6s %>
<% end %>
<% f.button :submit %>
<% end %>
この新しいフォームがレンダリングされると、ipv6_address の入力フィールドは含まれませんが、エラーはスローされません。レンダリングされたページのソースを確認しましたが、「ipv6」を参照しているものはありません。
fields_for を次のように変更すると:
<%= f.fields_for :ipv6_address, @ipv6s do |v6| %>
@ipv6s
次に、@ipv6s 内のオブジェクトの完全なリストを含む複数のドロップダウン選択フィールドがページに表示されます。