0

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 内のオブジェクトの完全なリストを含む複数のドロップダウン選択フィールドがページに表示されます。

4

1 に答える 1

1

新しい ivp6_addresses を作成したくないようです。必要なのは、コンピューターの作成時にコンピューターとアドレスの間の関連付けを構築することだけです。3 番目のテーブルを使用してこれを行い、すべてのコンピューターと ivp6 の関係を定義するか、モデルの定義を少し調整することができます。以下は、3 番目のテーブルを追加せずに行う方法です。

この関係は言葉遣いが少し逆のように見えるかもしれませんが、Rails は computer テーブルで ivp6_address_id を見つけることによって ipv6 の関連付けを見つけます。逆の場合は、作成したすべてのコンピューターに新しい ivp6_address が必要になりますが、これはあなたが望んでいたものではありません。ivp6_address_id または使用する外部キーに対して、コンピューター テーブルに適切な id 列があることを確認してください。

コンピュータモデル:

class Computer < ActiveRecord::Base
  belongs_to :ipv6_address
  ...

Ipv6Address モデル:

class Ipv6Address < ActiveRecord::Base
  attr_accessible :ip_address
  has_many :computers
  ...

次に、コンピューター フォームのネストされたフィールドを削除し、以下の行を追加して、フォームの送信時に関連付けを作成します。

<%= form_for( @computer ) do |f| %>
   <!--All the computer fields you need-->
  <%= collection_select(:computer, :ipv6_address_ids, Ipv6Address.all, :id, :ip_address, {}, { :multiple => true } )%>
  <% f.button :submit %>
<% end %>
于 2012-09-16T21:05:47.240 に答える