2012-04-20 18 views
6

He utilizado el formulario anidado modelo Ryan Bates, funciona bien, pero
tengo dos modelos i, e storage y pido ambos elementos anidados modelo llamado.Formulario anidado dinámico en el cambio del cuadro de selección

almacenamiento:

has_many :orders 
has_many :items, :dependent => :destroy 
accepts_nested_attributes_for :items 

Orden:

belongs_to:storage   
has_many :items, :dependent => :destroy 
accepts_nested_attributes_for :items 

En vista fin no es el almacenamiento caja de selección,

<%= f.select :storage_id, 
      Storage.all.map{|s| [s.store_no, s.id]} %> 

En la selección de números de almacenamiento respectivos artículos deben aparece en el formulario Pedidos con parcial
puede cualquier cuerpo decirme el la mejor manera de hacerlo

Gracias,

Respuesta

7

primero que hay que ver que el campo de entrada para ver que se cambia. Así, suponiendo que:

  1. el selector de almacenamiento tiene un id de 'almacenamiento'
  2. el selector de almacenamiento tiene el id del 'almacenamiento' como su valor

... se puede poner esto en su storage.coffee.js archivo:

jQuery -> 
    $('select#storage').change -> 
    storage_id = $('option:selected',this).val() 
    $.get 'storages/' +storage_id+ '/orders.js' 

Entonces, suponiendo que los pedidos se anidan debajo de almacenamiento, si su PeticionesController se ve así:

OrdersController < ApplicationController 

    def index 
    @storage = Storage.find(params[:storage_id]) 
    @orders = @storage.orders 
    end 

end 

... y si usted tiene un parcial de app/views/orders/_order.html.erb ...

... y si usted tiene un div#orders en su página que desea que los pedidos cayeron en ...

.. .then usted debería ser capaz de hacer un archivo app/views/orders/index.js.erb así:

$('div#orders').html('<%= escape_javascript(render @orders) %>'); 

Esto debería hacer una copia de la parcial para cada instancia de los pedidos que pertenecen a un determinado almacenamiento y añadirlo a la dom después de la selector de almacenamiento

Lo que está sucediendo es: cuando se cambia el menú de selección, se activa una solicitud js GET en el índice de pedidos para el almacenamiento dado. Entonces esa solicitud automáticamente intentará servir una página index.js, con las variables de instancia establecidas en el controlador disponible para esa vista. El js en esa vista se ejecutará después de insertar el rubí interpolado, para que pueda usar funciones de rieles (como render @orders) y luego la salida de esos se inyecta en el dom a través de $('div#orders').html('your rendered orders will be inserted in here by rails').

Claramente tendrás que modificar esto para que se ajuste a tu página, solo estoy adivinando qué elementos de tu página se llaman etc., pero este concepto básico debería funcionar bien. Hazme saber si tienes alguna pregunta.

+0

Gracias por su respuesta, he usado rails 2.3.5 y prototipo y seguí el concepto. –

Cuestiones relacionadas