Consejos zona clientes

Hola, estoy haciendo la zona de clientes de mi proyecto. Os explico en
que consiste, la aplicacion al crear un ticket/incidencia… (no son mas
que formularios para rellenar), generara un correo con un codigo
aleatorio que se enviara por email al correo del cliente. Este cuando
quiera podra consultar el estado de su producto sin mas que introducir
la clase del producto del que se trata (ya que tengo una tabla para cada
tipo de producto) y el codigo aleatorio que se le paso por email.

Pero tengo una duda,sobre como organizarme. Os cuento mi idea:

  1. He creado un link en la vista donde me logeo para dirigir a los
    usuarios a la zona de consultas

  2. En la zona de consultas he de crear un desplegable que me permita
    elegir el tipo de producto que es, un campo de texto para introducir la
    clave) y otro desplegable para seleccionar la empresa del cliente (esto
    en realidad no haria falta, con los dos datos anteriores ya se puede
    saber el id del producto, pero bueno asi redusco mas la busqueda y
    elimino posibles duplicados)

El problema que tengo es que no se como seleccionar el tipo de producto
y de empresa, es decir cuando creo un formulario no hay problema por que
en el new ya tengo un formulario selecionado y puedo trabajar sobre el.
Este seria el codigo:

<% form_for(@kirk) do |f| %>


Es decir mi desplegable es sobre ese kirk, pero en mi idea no estoy
trabajando sobre ningun objeto en particular y no se como plantearlo.

PD
No creo que necesite crear una tabla para las consultas, de tal forma
que se cree una nueva cada vez que el usuario uiera consultar el estado
del producto verdad? Creo que se debe de poder hace de una forma
bastante mas sencilla, en e l fondo solo quiero visualizar unos campos
de unas determinadas tablas, pero no se como ahcerlo sin complicarlo
demasiado.

Os agradeceria cualquier ayuda.

Un saludo

<%= 'Cliente' %> <%= 'Producto' %> <%= 'Estado del producto' %>
<%= f.collection_select :client_id, @clients,:id, :name, :prompt => "Selecione cliente" %>

Os comento mi idea:

Suponiendo que tengo un scaffold completo de zonacliente.

El Modelo:
Como voy a poder elegir en un desplegable entre estos productos (cada
uno tiene ya su tabla) kirk,vv,lgn,ticket,incidence Relacion de:

has_many :kirks
has_many :vvs
has_many :lgns
has_many :tickets
has_many :incidences
has_many :clients #habra un desplegable para elegir el cliente
(objeto que tb tiene su tabla)

La tabla de zonacliente constara de:
id
status->lugar donde almacenare el estado del objeto consultado para
mostrarlo al cliente
cliente->campo que cargara el cliente seleccionado (ya tengo una tabla
algunos clientes)
Producto->Igual que el anterior pero con el producto. Me crearia una
nueva tabla (pej:zonaclienteproducto)que tubiese los campos id y name
con name igual a los producots que puedo elegir

El controlador:
constara de new, show ye index

new: Me llevara la vista que le permitira introducir todos los datos al
cliente
show: Tras crearlo unicamente tendre que agregar el campo status. He
pensado qeu le forma de saber que objeto he introducido seria algo asi:

def show
@zonacliente = Zonacliente.find(params[:id])
#comparo el producto seleccionado con el nombre de la tabla zonacliente
#producto para realizar la busqueda en una tabla u otra
if @zonaclienteproductos.name= ‘Ticket’
@ticket=Ticket.find(params: passwordaleatorio)
.
.
. y asi con todos los productos -> luego en el view ya muestro el
campo status del objeto seleccionado que es lo que quiere ver el cliente

Index:
constara unicamente de un link a new zonacliente

Que os parece?.. yo lo sigo viendo un poco demasiado pero al menos creo
que he encontrado algo.

Un saludo y a ver si alguien me puede alumbrar un poco.

:wink:

Usa form_tag en lugar de form_for.

Y usa los helper de formulario acabados en _tag. Estos no requieren
hacer referencia a ninguna instancia.

Como última opción usa etiquetas html de formulario directamente. Si
los helpers de Rails no te aportan más que problemas pues en ese caso
no los uses.

Suerte
F.

(Perdón por la sintaxis, escrito desde el móvil)

Fernando Guillén
Desarrollador Web Freelance

El 09/12/2008, a las 19:11, Jose vicente Ribera pellicer
<[email protected]

escribió:

El día 10 de diciembre de 2008 1:03, Ceritium [email protected]
escribió:> Tenías que estar muy aburrido para responder a la lista desde el móvil

Fernando xD

Así es :slight_smile:

Sobre lo de no usar los helpers de rails pues eres libre, pero nunca me ha
pasado que se me queden cortos, si es tu caso explicamelo porque no lo veo
:slight_smile:

Si, es muy raro que no pueda usar un helper de rails para
algúnelemento del formulario, pero si la cosa se me empieza a liar, y no
por culpa del helper sino por la dureza de entendederas que ande, no
se me caen los ojos por pasar del helper y tirar de .

Desde que estoy en Rails tiendo a abstraerme lo máximo posible del html, js
y css (helpers, rjs, haml, sass, erb…) ¿Qué pensais ustedes de esto?

Esto daría píe a una larga guerra :slight_smile:

f.

Tenías que estar muy aburrido para responder a la lista desde el móvil
Fernando xD

Sobre lo de no usar los helpers de rails pues eres libre, pero nunca me
ha
pasado que se me queden cortos, si es tu caso explicamelo porque no lo
veo
:slight_smile:

Desde que estoy en Rails tiendo a abstraerme lo máximo posible del html,
js
y css (helpers, rjs, haml, sass, erb…) ¿Qué pensais ustedes de esto?

2008/12/9 Fernando G. [email protected]

mmmmm…

creo que lo estás liando un poco.

No veo mal que tengas un controlador para las búsquedas pero no creo
que te haga falta un modelo ActiveRecord para ellas.

Puedes hacer un controlador con dos actions:

def search_form
@project_types = [
KeyValue.new( :key => ‘ticket’, :value => ‘Ticket’ ),
KeyValue.new( :key => ‘product’, :value => ‘Product’ ),
KeyValue.new( :key => ‘wadus’, :value => ‘Wadus’ ),
]
@clients = Client.find(all)
end

def search_results
@status = nil

case params[:type]
when ‘trip’
@status = Ticket.find( :first, :conditions => [‘secret_id = ? and
client_id = ?’, params[:secret_id], params[:client_id] ).status
when ‘product’
@status = …
when ‘wadus’
@status = …
else
raise “Bad type: #{params[:type]}”
end
end

Así en @project_types tienes tu array de tipos de productos.
En @clients tienes tu array de clientes

Y con esto puedes construir el formulario

Para hacer la búsqueda discriminando por tipo de producto yo usaría un
case/when más que un montón de ifs…

Todo esto lo he puesto al vuelo, y no soy ningún experto así que no
sólo errores sino malos planteamientos es lo podrás encontrar.

Suerte.
f.

El día 9 de diciembre de 2008 19:56, Jose vicente Ribera pellicer
[email protected]
escribió:> Os comento mi idea:

Ayer me toco jornada completa en el Parque tecnologico asi que no pude
mirar los consejos. Me estoy poniendo un rato al lio y me surgen dudas:

Fernando G. wrote:

Usa form_tag en lugar de form_for.

Y usa los helper de formulario acabados en _tag. Estos no requieren
hacer referencia a ninguna instancia.

Esto quiere decir que no tengo que especificar el objeto en el
controlador?
Vamos que puedo usar objetos (ya Sea Ticket, Lgn, Vv sin necesidad de
tener las referencias en el controlador??, es que me parece demasiado
bonito para que sea verdad.

sobre esto:

No veo mal que tengas un controlador para las b�squedas pero no creo
que te haga falta un modelo ActiveRecord para ellas.

Puedes hacer un controlador con dos actions:

def search_form
@project_types = [
KeyValue.new( :key => ‘ticket’, :value => ‘Ticket’ ),
KeyValue.new( :key => ‘product’, :value => ‘Product’ ),
KeyValue.new( :key => ‘wadus’, :value => ‘Wadus’ ),
]
@clients = Client.find(all)
end

def search_results
@status = nil

case params[:type]
when ‘trip’
@status = Ticket.find( :first, :conditions => [‘secret_id = ? and
client_id = ?’, params[:secret_id], params[:client_id] ).status
when ‘product’
@status = …
when ‘wadus’
@status = …
else
raise “Bad type: #{params[:type]}”
end
end

As� en @project_types tienes tu array de tipos de productos.
En @clients tienes tu array de clientes

Y con esto puedes construir el formulario

Para hacer la b�squeda discriminando por tipo de producto yo usar�a un
case/when m�s que un mont�n de ifs…


Me parece muy interesante, la idea es que en el desplegable que
muestre los clientes sea el que haga que el controlador implemente la
busqueda en un tabla determinada.

Es decir si se selecciona el id=1 que es el que se refiere a los tickets
se busque en la tabla de tickets. Tienes razon no veo por que necesito
tener un modelo, lo puse por las relaciones, pero no tiene nada que ver.
No necesito tener ninguna tabla para zonaclientes, lo unico que tengo
que hacer es leer en la que toque.

Por cierto keyvalue.newcrea un nuevo indice??.
De momento probare con la idea del controlador y el form_tag (aunque
este me gustaria saber bien como usarlo).

Gracias por las respuestas

Esta pagina me esta ayudando bastante, comenta distintas formas de
implementar una seleccion.

Por si a alguien le interesa:
http://shiningthrough.co.uk/blog/show/6

El día 11 de diciembre de 2008 16:43, Jose vicente Ribera pellicer
[email protected]
escribió:> Esta pagina me esta ayudando bastante, comenta distintas formas de

implementar una seleccion.

Por si a alguien le interesa:
http://shiningthrough.co.uk/blog/show/6

Pues sí que está bien… gracias.

f.

La doc oficial tampoco está mal:

2008/12/11 Fernando G. [email protected]:

El día 11 de diciembre de 2008 16:08, Jose vicente Ribera pellicer
[email protected]
escribió:> controlador?

Vamos que puedo usar objetos (ya Sea Ticket, Lgn, Vv sin necesidad de
tener las referencias en el controlador??, es que me parece demasiado
bonito para que sea verdad.

No entiendo bien la pregunta… pero vamos que creo que la respuesta es
:slight_smile:

Por cierto keyvalue.newcrea un nuevo indice??.

Perdón… KeyValue me lo he inventado… podría ser una clase con una
definición tal que
así:
class KeyValue
attr_accesor :key, :value
end

O puedes cambiar donde pone KeyValue y poner Struct … creo que
funcionaría.

f.

Os comento mis avances…

El controlador:


class ZonaclientesController < ApplicationController

skip_before_filter :login_required #para que me deje ir al enlace sin
necesidad de logearme

def index

#segun el la opcion del desplegable optaare por buscar un determinado
tipo de objeto, es decir buscare en la tabla correpondiente

case params[:tabla] #tabla es el parametro del desplegable
when ‘Famitel’
@ticket=Ticket.find( :first,select=>“reference”,
:conditions=>[‘codigo_aleatorio=?’,params[:codigo_aleatorio]])

when ‘Polycom Kirk’
@Kirk=Kirk.find( :first, :select =>“reference”,
:conditions=>[‘codigo_aleatorio=?’,params[:codigo_aleatorio]])

when ‘Lg Nortel’
@lgn=Lgn.find( :first, :select =>“reference”,
:conditions=>[‘codigo_aleatorio=?’,params[:codigo_aleatorio]])

when ‘Videovigilancia’
@ticket=Ticket.find( :first, :select =>“reference”,
:conditions=>[‘codigo_aleatorio=?’,params[:codigo_aleatorio]])

end

respond_to do |format|
format.html # index.html.erb
end
end

def muestroestado # LOUNICO QUE ME INTERESA DE EL ES LA VISTA PARA
MOSTAR AHI EL ESTADO DEL ELEMENTO SELECCIONADO
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @zonaclientes }
end
end

La vista del incex->Aqui tengo la duda

<%= select_tag "tabla", options_for_select(["Famitel", "Polycom Kirk", "LG Nortel", "Dimax Videovigilancia"]) %>
<%= button_to “Buscar” , :action => :muestroestado %>

<%end%>


Aqui es donde se me plantean las duudas, la primera es que tal y como
esta escrita el codigo en la vista solo se ve le boton de buscar, ni
rasto de desplagable ni del campo de texto ni nada de nada. Yo creo que
la idea no esta muy lejos de la correcta…pero claro no tengo nada para
introducir los datos y seguir.

Adjunro una imagen de la captura de pantalla como adjunto

El problema debe de estar en el div, he copy/paste estas tres lineas
fuera de el:

<%= select_tag “tabla”, options_for_select([“Famitel”, “Polycom Kirk”,
“LG Nortel”, “Dimax Videovigilancia”]) %>
<%= text_field :buscar, params[:codigo_aleatorio]%>
<%= button_to “Buscar” , :action => :muestroestado %>

Y ya se muestran en la pantalla, arriba ala izquierda sin ningun orden,
pero bueno ahora eso es lo menos importante.

Metele un return a cada when por que sino el código continúa y al
final creo que se ejecuta implícitamente un render por defecto con el
nombre de la acción.

Prueba a ver. Y sino intenta asegurarte de que se esta ejecutando el
when que esperas.

F

(Perdón por la sintaxis, escrito desde el móvil)

Fernando Guillén
Desarrollador Web Freelance

El 11/12/2008, a las 19:55, Jose vicente Ribera pellicer
<[email protected]

escribió:

Siento que el tema se este alargando tanto, supongo que asi sera mas
dificil de seguir, en fin como siempre agradezco comantarios. He hecho
algunos cambios y creo qeu la solucion debe estar cerca.

En el contrlador: Ahora en el index no tengo nada, siimplemente muestro
los datos a rellenar en su vista y tengo un boron que me lleva al metodo
elijo vista, este asu vez dependiendo del valor del desplagable nos hara
un render a la vista correspondiente que incluyo en la carpeta views de
elijovista (logicamente en cada una solo muestro el tipo de obeto que se
ha selecionada, en el fondo es como la vista del show de cada elemento.

Dejo el codigo:
def index
respond_to do |format|
format.html # index.html.erb
end
end

def elijovista
case params[:tabla]
when ‘Famitel’
@ticket=Ticket.find( :first, :select =>“reference”,
:conditions=>[‘codigo_aleatorio=?’,params[:codigo_aleatorio]])

renders app/views/zonaclientes/showFamitel

render :template => ‘zonaclientes/showFamitel’

when ‘Polycom Kirk’
@Kirk=Kirk.find( :first, :select =>“reference”,
:conditions=>[‘codigo_aleatorio=?’,params[:codigo_aleatorio]])
render :template => ‘showPolycom’

when ‘Lg Nortel’
@lgn=Lgn.find( :first, :select =>“reference”,
:conditions=>[‘codigo_aleatorio=?’,params[:codigo_aleatorio]])
render :template => ‘ShowLGN’

when ‘Videovogilancia’
@ticket=Ticket.find( :first, :select =>“reference”,
:conditions=>[‘codigo_aleatorio=?’,params[:codigo_aleatorio]])
render :template => ‘ShowVV’

 end

end


En la vista del index capturo pulsar el boton buscar me redirecionara a
elijobusqueda.

Codigo importante:
<%= select_tag “tabla”, options_for_select([“Famitel”, “Polycom Kirk”,
“LG Nortel”, “Dimax Videovigilancia”]) %>
<%= text_field :buscar, params[:codigo_aleatorio]%>
<%= button_to “Buscar” , :action => :elijovista %>


He introdcido un password correcto para Famitel y al pulsar buscar
aperece el error de template is missing

Template is missing

Missing template zonaclientes/elijovista.html.erb in view path
C:/InstantRails-2.0-win/rails_apps/daticket/app/views

Al hacer el render :template no deberia ir a la vista que le paso y
olvidar la de elijovista??? esa era mni idea, elijovista segun el
parametro que elijo me obtiene el objeto y lme lanza a la vista
especifica de este

Que falla?

Fernando G. wrote:

Metele un return a cada when por que sino el código continúa y al
final creo que se ejecuta implícitamente un render por defecto con el
nombre de la acción.

Gracias crack, lo he intentado pero nada, sigue queriendo ir a la vista
de elijovista, se salta los render :((

Creo que tienes que volver a verte el screencast de Ryan.

Mira como usa el comando ‘next’. Y la consola ‘irb’ para consultar las
variables en tiempo real.

También vigila el log en la petición a ver que parámetros y valores
se están enviando.

F.

(Perdón por la sintaxis, escrito desde el móvil)

Fernando Guillén
Desarrollador Web Freelance

El 11/12/2008, a las 21:11, Jose vicente Ribera pellicer
<[email protected]

escribió:

He instalado el debugger de ruby y me he visto un screencast de
railscasts sobre el que me ha servido de mucho.

con este codigo:
def elijovista
debugger
case params[:tabla]
when ‘Famitel’
@ticket=Ticket.find( :first, :select =>“reference”,
:conditions=>[‘codigo_aleatorio=?’,params[:codigo_aleatorio]])

renders app/views/zonaclientes/showFamitel

render :template => ‘zonaclientes/showFamitel’

La consola muestra se para en la linea 6, tal que asi:
=>case params[:tabla]

Vamos que parece que el case no capture el params[:tabla] que es donde
le meto la tabla en la que tiene que realizar la busqueda

Creo que deberías ser menos impaciente.

Busca tutoriales y haz unos cuantos ejemplos antes de intentar tus
propias aventuras.

En la lista no vas a conseguir el empujón inicial que necesitas.

F.

(Perdón por la sintaxis, escrito desde el móvil)

Fernando Guillén
Desarrollador Web Freelance

El 11/12/2008, a las 22:58, Jose vicente Ribera pellicer
<[email protected]

escribió:

Fernando G. wrote:

Creo que deberías ser menos impaciente.

Busca tutoriales y haz unos cuantos ejemplos antes de intentar tus
propias aventuras.

En la lista no vas a conseguir el empujón inicial que necesitas.

F.

Para mi que desde le controlador no caraga el valor de :tabla, por eso
no entran en el case, voy a seguir investigando sobre la sintaxis.

De todas formas cualquier ayuda sera bienvenida.

PD.
Otra duda que surge: Aunque en el controlador de zonaclientes me salte
la autentificacion me dejara luego leer las tablas de los distintos
productos sin autentificarme…espero que si. Pero bueno poco a poco.

Un saludo y como siempre gracias por los consejos habidos y por haber :wink: