2012-01-24 235 views
1

我是一名Rails新手,在這個問題上與我無關......總之,我有一個應用程序可以跟蹤帶有IP地址的服務(服務器)。我試圖做的是建立起來,這樣,當我創建一個新的服務將出現以下情況:Rails 3嵌套屬性?

  • 所有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 %> 

我如何使它所以每個選定的IP用新創建的service_id更新?

在此先感謝您的幫助。

回答

2

這不是一個真正的嵌套屬性的東西,也不需要虛擬屬性。你只是在編輯一個多關係。

首先,您可能希望將編輯/更新操作用於RESTful。閱讀routing guide

在你的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 %> 
+0

非常感謝,您的回答幫助我清除了關於關係的事情...當我提交表單時,我得到了「ActiveRecord :: AssociationTypeMismatch」 - > Ip(#2253505960)字符串(#2241209340)。我的創建操作(我懷疑是原因)有以下幾種:'@user = current_user' @service = @ user.services.create(params [:service])' –

+1

對不起,應該是'collection_select:ip_ids '因爲你實際上正在編輯ID數組(整數)。更正了答案。 – sj26