rails nested_form的问题

时间:2017-11-01 01:26:34

标签: ruby-on-rails ruby ruby-on-rails-4 nested-forms

每个人的好日子,我有一个问题,不让我睡觉,我是Rails的新手,我想创建一个电子商务,我有产品,每个产品可以有多个图像,所以我使用nested_forms创建一对多关系。显然,如果它们被上传到服务器但出现此问题: enter image description here

我有这段代码:

product.rb

'234.5' asNumber

imagenes_producto.rb

Number readFromString: '234.5'

_form.erb

class Product < ApplicationRecord
	has_many :imagenes_productos
  	accepts_nested_attributes_for :imagenes_productos, allow_destroy: true
	#paperclip para subir imagenes
	has_attached_file :imagenPrincipal, style: {medium: "1280x720", thumb:"800x600"}
	validates_attachment_content_type :imagenPrincipal, content_type: /\Aimage\/.*\z/
end

products_controller.rb

class ImagenesProducto < ApplicationRecord
	belongs_to :product
end

show.erb

<%= javascript_include_tag "application", "nested_form" %>


<div id="principalNuevoProducto">
  <div id="centradoNuevoProducto">
    <%= nested_form_for(@product) do |form| %>
      <% if product.errors.any? %>
        <div id="error_explanation">
          <h2><%= pluralize(product.errors.count, "error") %> prohibited this product from being saved:</h2>

          <ul>
          <% product.errors.full_messages.each do |message| %>
            <li><%= message %></li>
          <% end %>
          </ul>
        </div>
      <% end %>

    <div id="izquierdaNuevoProducto">
      <div id="detallesProducto">
        <h2 id="subtitulosNuevoProducto">Detalles del producto</h2>
        <div id="contenidoDetallesProducto">
          <%= form.text_field :nombre, id: :product_nombre, placeholder: "Nombre de tu producto" %>
          <%= form.text_area :descripcionBreve, id: :product_descripcionBreve, placeholder: "Escribe una descripción breve sobre tu producto o servicio..." %>
            <div id="contenedorFileField">
              <p>Añadir imagen principal:</p>
              <%= form.file_field :imagenPrincipal, class:"upload" %>
            </div>
            <div id="contenedorYoutubeURL">
              <p>URL de video de Youtube:</p>
              <%= form.text_field :URLvideo, id: :product_URLvideo, placeholder: 'https://www.youtube.com/watch?v=-1111111' %>
            </div>
            <fieldset id="tareas">
              <p>Añadir imágenes secundarias</p>
              <%= form.fields_for :imagenes_productos do |imagenes_form| %>
                <%= imagenes_form.file_field :imagen %>

                <%= imagenes_form.link_to_remove "Eliminar esta imagen" %>
              <% end %>
              <p><%= form.link_to_add "Agregar una imagen", :imagenes_productos %></p>
            </fieldset>
        </div> 
      </div>  

      <div id="descripcionDetallada">
        <h2 id="subtitulosNuevoProducto">Decripción detallada</h2>
        <div id="editor"></div>
        <%= form.hidden_field :descripcionDetallada, id: :product_descripcionDetallada %>
      </div>

      <div id="inventario">
        <h2 id="subtitulosNuevoProducto">Inventario</h2>
        <div id="contenidoInventario">
          <p>
            ¿Desea manejar inventario de este producto?
          </p>
          <%= form.select(:manejarInventario, ['Si', 'No'], {}, {:class => 'manejarInventario'}) %>
          <p id="cantidadProductos">Cantidad de productos disponibles</p>
          <%= form.text_field :stock, placeholder:'0', id:'stock' %>
        </div>
      </div>

      <div id="detallesCompra">
        <h2 id="subtitulosNuevoProducto">Detalles de compra</h2>
        <div id="contenidoDetallesCompra">
          <div id="izquierdaDetallesCompra">
             <%= form.text_field :precioNormal, id: :product_precioNormal, placeholder:'Precio', class:'fieldsDetallesCompra' %>
             <p>
               Seleccione cuando comenzará la oferta:
             </p>
             <%= form.datetime_select(:inicioOferta, prompt: { day: 'Día', month: 'Mes', year: 'Año', hour: 'Hora', minute:'Minutos' }, order: [:day, :month, :year], start_year: 2017) %>
             <%= form.text_field :diasAnticipacion, id: :product_diasAnticipacion, placeholder: 'Días de anticipación para entrega de resultado', class:'fieldsDetallesCompra' %>
          </div>
          <div id="derechaDetallesCompra">
            <%= form.text_field :precioOferta, id: :product_precioOferta, placeholder: 'Precio de oferta', class:'fieldsDetallesCompra' %>
            <p>
               Seleccione cuando terminará la oferta:
             </p>
            <%= form.datetime_select(:terminoOferta, prompt: { day: 'Día', month: 'Mes', year: 'Año', hour: 'Hora', minute:'Minutos' }, order: [:day, :month, :year], start_year: 2017) %>
            <%= form.text_field :entregaResultados, id: :product_entregaResultados, placeholder: 'Días para entrega de resultados', class:'fieldsDetallesCompra' %>
          </div>
          <p id="preguntaDetallesCompra">¿Permite pedidos con menor tiempo de anticipación? De ser así, ¿Cuánto aumenta el costo?</p>
          <%= form.select(:menorAnticipacion, options_for_select([['Acepto con retraso', 1],['No acepto con retraso', 0]]), {}, {:class => 'anticipacion_field'}) %>
          <%= form.select(:diasAtrasoAnticipacion, options_for_select([['1 dia anticipación', 1],['2 días anticipación', 2],['3 dias anticipación', 3],['4 dias anticipación', 4],['5 dias anticipación', 5], ['6 dias anticipación', 6],['7 dias anticipación', 7], ['8 dias anticipación', 8], ['9 dias anticipación', 9],['10 dias anticipación', 10], ['11 dias anticipación', 11], ['12 dias anticipación', 12], ['13 dias anticipación', 13], ['14 dias anticipación', 14], ['15 dias anticipación', 15], ['16 dias anticipación', 16], ['17 dias anticipación', 17], ['18 dias anticipación', 18], ['19 dias anticipación', 19], ['20 dias anticipación', 20], ['21 dias anticipación', 21], ['22 dias anticipación', 22], ['23 dias anticipación', 23], ['24 dias anticipación', 24], ['25 dias anticipación', 25], ['26 dias anticipación', 26], ['27 dias anticipación', 27], ['28 dias anticipación', 28], ['29 dias anticipación', 29], ['Un mes', 30], ['Un mes y una semana', 37], ['Un mes y dos semanas', 45], ['Un mes y tres semanas', 52], ['Dos meses', 60]]), {}, {:class => 'atrasoAnticipacion_field'}) %>
          <%= form.text_field :aumentoAtrasoAnticipacion, id: :product_aumentoAtrasoAnticipacion, placeholder: '100.00' %>
          <p id="tituloMetodosPago">Métodos de pago</p>
          <p id="pmetodos">Indique hasta en cuantos pagos podrá liquidar el cliente</p>
          <%= form.select(:numeroPagos, options_for_select([['1 pago', 1], ['3 pagos', 3], ['6 pagos', 6], ['9 pagos', 9], ['12 pagos', 12]]), {}, {:class => 'numeroPagos_field'}) %>
          <p id="pmetodos">Indique con cuantos días de anticipación debe estar liquidado el total de la compra</p>
          <%= form.select(:diasAnticipoLiquidacion, options_for_select([['1 dia anticipación', 1],['2 días anticipación', 2],['3 dias anticipación', 3],['4 dias anticipación', 4],['5 dias anticipación', 5], ['6 dias anticipación', 6],['7 dias anticipación', 7], ['8 dias anticipación', 8], ['9 dias anticipación', 9],['10 dias anticipación', 10], ['11 dias anticipación', 11], ['12 dias anticipación', 12], ['13 dias anticipación', 13], ['14 dias anticipación', 14], ['15 dias anticipación', 15], ['16 dias anticipación', 16], ['17 dias anticipación', 17], ['18 dias anticipación', 18], ['19 dias anticipación', 19], ['20 dias anticipación', 20], ['21 dias anticipación', 21], ['22 dias anticipación', 22], ['23 dias anticipación', 23], ['24 dias anticipación', 24], ['25 dias anticipación', 25], ['26 dias anticipación', 26], ['27 dias anticipación', 27], ['28 dias anticipación', 28], ['29 dias anticipación', 29], ['Un mes', 30], ['Un mes y una semana', 37], ['Un mes y dos semanas', 45], ['Un mes y tres semanas', 52], ['Dos meses', 60]]), {}, {:class => 'anticipacionLiquidacion_field'}) %>
          <p id="pmetodos">¿Permitirá a sus clientes manejar pagos libres? De lo contrario se manejarán pagos iguales.</p>
          <%= form.select(:permitePagosLibres, ['Si', 'No'], {}, {:class => 'pagosLibres_field'}) %>
        </div>
      </div>


    </div> <!-- Aqui cierra izquierdaNuevoProducto -->
    
    <div id="derechaNuevoProducto">
      <div id="publicarProducto">
        <h2 id="subtitulosNuevoProducto">Publicar producto o servicio</h2>
        <div id="contenidoPublicar">
          <div id="botonVistaPrevia">
            <p style="float: left;">Vista previa</p>
            <img src="/assets/eye.png" style="float: left;">
          </div>
          <%= form.select(:visible, ['Visible', 'Oculto'], {}, {:class => 'visible_field'}) %>
          <div id="botonesPublicarProducto">
            <div class="boton-publicar gris">
              <p>Cancelar</p>
            </div>
            <%= form.submit 'Publicar', :class => 'boton-publicar azul' %>
          </div>
        </div>
      </div>
      <!-- Modificar -->
      <div id="tipoEvento">
        <h2 id="subtitulosNuevoProducto">Tipo de evento</h2>
        <div id="contenidoTipoEvento">
          <p>Categoria</p>
          <%= form.select(:categoria, ['Fotografía y video', 'Invitaciones', 'Cabinas de fotos', 'Spa', 'Pasteleria', 'Estéticas', 'Letras gigantes', 'Organizadores de eventos', 'Tuxedos', 'Renta de autos o transporte', 'Decoración y mantelería', 'Coctelería/shots/licores', 'Grupos musicales o djs', 'Agencia de viajes', 'Salones ', 'Vestidos', 'Florerias', 'Candy bar', 'Coreografias', 'Animación','Guarderías para eventos', 'Religiosos', 'Servicios banquetes y alimentos']) %>
        </div>
      </div>
      <div id="lugarEntrega">
        <h2 id="subtitulosNuevoProducto">Lugar de entrega</h2>
        <div id="contenidoLugarEntrega">
          <p>Escribe el lugar de entrega</p>
          <%= form.text_field :lugarEntrega, placeholder:'Ej. A domicilio o calle Prime #3125', id: :product_lugarEntrega %>
        </div>
      </div>
      <div id="duracionServicio">
        <h2 id="subtitulosNuevoProducto">Duración del servicio</h2>
        <div id="contenidoDuracionServicio">
          <p>Si estás ofreciendo un servicio y no un producto específica la duración de tu servicio: </p>
          <%= form.select(:duracionServicio, ['00:30:00', '01:00:00', '01:30:00', '02:00:00', '02:30:00', '03:00:00', '03:30:00', '04:00:00', '04:30:00', '05:00:00', '05:30:00', '06:00:00', '06:30:00', '07:00:00', '07:30:00', '08:00:00', '08:30:00', '09:00:00', '09:30:00', '10:00:00', '10:30:00', '11:00:00', '11:30:00', '12:00:00', '12:30:00', '13:00:00', '13:30:00', '14:00:00', '14:30:00', '15:00:00', '15:30:00', '16:00:00', '16:30:00', '17:00:00', '17:30:00', '18:00:00', '18:30:00', '19:00:00', '19:30:00', '20:00:00', '20:30:00', '21:00:00', '21:30:00', '22:00:00', '22:30:00', '23:00:00', '23:30:00', '24:00:00'], {}, {:class => 'servicio_field'}) %> hrs
          
        </div>
      </div>

    </div>
    <% end %>
  </div>
</div>

非常感谢您提前

1 个答案:

答案 0 :(得分:2)

您需要在product_id表上添加外键imagenes_productos,以便rails知道这种关系。这就是错误的原因。 此外,使用image_tag,您必须以image_tag(source, options={})这种格式指定图片来源,这样您可能希望按照image_tag("#{imagen.name}" + ".png")或您图像的任何格式执行更多操作。