Rails 3嵌套属性?
问题描述:
我是一名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更新?
在此先感谢您的帮助。
答
这不是一个真正的嵌套属性的东西,也不需要虚拟属性。你只是在编辑一个多关系。
首先,您可能希望将编辑/更新操作用于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 %>
非常感谢,您的回答帮助我清除了关于关系的事情...当我提交表单时,我得到了“ActiveRecord :: AssociationTypeMismatch” - > Ip(#2253505960)字符串(#2241209340)。我的创建操作(我怀疑是原因)有以下几种:'@user = current_user' @service = @ user.services.create(params [:service])' –
对不起,应该是'collection_select:ip_ids '因为你实际上正在编辑ID数组(整数)。更正了答案。 – sj26