Recodificación, no se puede usar el método auxiliar en el modelo

¿Cuál es una forma mejor (adecuada) de codificar esto según MVC? Aquí está la situación:

Tengo un collection_select en mi formulario, y funciona bien, sin embargo, quiero hacer algo como esto (tenga en cuenta el texto de la opción, el cuarto argumento)

#Form.html.haml
= form_for(@payment) do |f|
 = f.collection_select(:invoice_id, Invoice.due, :id, :number + ' ' + money(:amount_due))

Eso no funcionará porque, hasta donde yo sé, no puedes concatenar los símbolos. Entonces, recurrí a esto:

#Form.html.haml
= form_for(@payment) do |f|
  = f.collection_select(:invoice_id, Invoice.due, :id, :number_with_amount_due)

#Invoice.rb
def number_with_amount_due
  "##{number} (#{money(amount_due)})"
end

Lo que funcionaría si no estuviera tratando de llamar a un método auxiliar en el Modelo.

¿Entonces qué debo hacer? Sería bueno poder concatenar el texto seleccionado en las vistas, pero si no es posible, ¿cómo puedo lograr lo que estoy tratando de hacer mientras conservo el MVC adecuado en Rails?

preguntado el 28 de julio de 12 a las 23:07

1 Respuestas

Edité en gran parte mi respuesta porque me equivoqué.

Usando f.select, podrá proporcionar una matriz que contenga exactamente lo que necesita. Suponiendo que Invoice.due devuelve la colección deseada de Invoice

Aquí va :

f.select(:invoice_id, Invoice.due.map {|i| ["#{i.number} #{money(i.amount_due)}", i.id]})

Creo que collection_select no puede lograr lo que está tratando de hacer, a menos que agregue el ayudante que contiene money a su modelo.

Respondido 29 Jul 12, 03:07

Eso no funciona porque: = form_for(@payment) do |f| es la f. Agregaré esto a la pregunta original. Gracias por el comentario - Wes Foster

Entonces si un pago has_one :invoice use f.object.invoice.number y f.object.invoice.amount_due - antonio alberto

El pago belongs_to :invoice, no "tiene_uno". Cuando probé su código (f.object.invoice.number), aparece un error: undefined method 'number' for nil:NilClass - Wes Foster

Buena idea, me gusta, y nos estamos acercando. Sin embargo, obtengo un menú desplegable con #<Invoice:0x64d356> (similar) tanto en las áreas de valor como de texto de cada opción. Lo cual (estoy bastante seguro) significa que quiere mostrar el objeto en lugar de llamar al método y mostrarlo. ¿Alguna idea de por qué? - Wes Foster

Sí, es tarde, solía each en lugar de map, inténtalo, edité la respuesta - antonio alberto

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.