1

IPアドレスでサービス(サーバー)を追跡するアプリケーションがあります。新しいサービスを作成するときに次のように設定しようとしています。

  • すべてのIPアドレスが検索され、service_idがない場合は、使用可能として分類され、新しいサービスページの選択ボックスに戻されます。
  • ユーザーが選択ボックスから1つ以上のIPアドレスを選択し、残りの必要なサービスデータを入力し、送信を押すと、各IPアドレスが作成されたばかりのサービスのservice_idで更新されます。(IPが取得済みとしてマークされるように)。

私が理解しているように、これはネストされた属性または仮想属性のいずれかで可能になるはずだと思います...しかし、私にはわかりません。

私はそのようなモデルを持っています:

class Service < ActiveRecord::Base
  has_many :ips
  attr_accessor :service_ips
end

class Ip < ActiveRecord::Base
  belongs_to :service
end

そのようなコントローラー:

 class ServicesController < ApplicationController
 def new
   @available_ips = Ip.where(:service_id == nil)
 end

そしてそのような見方:

<%= form_for(@service) do |f| %>
  <%= f.label :service_ips %>
  <%= f.collection_select(:service_ips, @available_ips, :id, :address, { }, {:multiple => true, :size => 5}) %>

  <%= f.label :hostname %><br />
  <%= f.text_field :hostname, :size => 40 %>

  <%= f.submit :id => "submit"%>
<% end %>

選択した各IPが新しく作成されたservice_idで更新されるようにするにはどうすればよいですか?

4

1 に答える 1

2

これは実際にはネストされた属性ではなく、仮想属性も必要ありません。has-many リレーションシップを編集しているだけです。

まず、おそらく編集/更新アクションを使用して RESTful にする必要があります。ルーティング ガイドをお読みください。

あなたの routes.rb で:

resources :services

それで:

class ServicesController
  def edit
    @service = Service.find(params[:id])
    @available_ips = Ip.where(:service_id => nil)
  end

  def update
    @service = Service.find(params[:id])
    if @service.update_attributes params[:service]
      redirect_to @service
    else
      render :edit
    end
  end
end

モデルにアクセサーは必要ありません。コレクションはアクセサーです。

class Service < ActiveRecord::Base
  has_many :ips
end

class Ip < ActiveRecord::Base
  belongs_to :service
end

次に、views/services/edit.html.erb で:

<%= form_for(@service) do |f| %>
  <%= f.label :ips %>
  <%= f.collection_select(:ip_ids, @available_ips + @service.ips, :id, :address, { }, {:multiple => true, :size => 5}) %>

  <%= f.label :hostname %><br />
  <%= f.text_field :hostname, :size => 40 %>

  <%= f.submit :id => "submit" %>
<% end %>
于 2012-01-24T10:59:12.767 に答える