Rails 3 вложенных атрибута? - PullRequest
1 голос
/ 24 января 2012

Я новичок в рельсах, так что обнажите меня на этом ... Короче, у меня есть приложение, которое отслеживает службы (серверы) с 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 %>

Как мне сделать так, чтобы каждый выбранный IP обновлялся только что созданным идентификатором service_id?

Заранее спасибо за помощь.

1 Ответ

2 голосов
/ 24 января 2012

Это на самом деле не вещь вложенных атрибутов, и вам не нужны виртуальные атрибуты.Вы просто редактируете отношение «есть-много».

Во-первых, вы, вероятно, хотите использовать действия редактирования / обновления, чтобы получить RESTful.Прочтите руководство по маршрутизации .

В вашем маршруте .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

Затем в ваших представлениях / 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 %>
...