1

我有一个使用 IP 地址跟踪服务(服务器)的应用程序。我正在尝试对其进行设置,以便在创建新服务时发生以下情况:

  • 查找所有 IP 地址,如果它们没有 service_id,则它们被归类为可用并返回到新服务页面上的选择框。
  • 用户从选择框中选择一个或多个 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 %>

如何使用新创建的 service_id 更新每个选定的 IP?

4

1 回答 1

2

这不是真正的嵌套属性,也不需要虚拟属性。你只是在编辑一个有很多的关系。

首先,您可能希望使用 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

然后在您的视图/服务/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 回答