2012-01-24 190 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