2011-02-16 17 views
29

Soy nuevo en los carriles y preguntando cuando debería poner el código en un ayudante en comparación con poner el código en el modelo.utilizar ayudantes vs Modelo

¿Existe una "regla de oro" por así decirlo?

Respuesta

26

Use ayudantes si está trabajando en una vista (plantilla) y que necesita para construir un poco compleja de HTML, tales como <table>. O bien, si desea cambiar algunos datos de presentación que no están conectados a la base de datos.

def truncate_html(html, options = {}) 
    options[:length] = 35 unless options[:length] 
    truncate(strip_tags(html), options) 
end 

Utilice modelos cuando trabaje con objetos de base de datos, y desee simplificar la lógica comercial.

def one_day? 
    start_date.to_s[0,9] == end_date.to_s[0,9] 
    end 

Aquí es Ayudantes en las guías: http://guides.rubyonrails.org/form_helpers.html

Y aquí es Modelos: http://guides.rubyonrails.org/active_record_querying.html

+0

"poco compleja de HTML como un" --- como un qué? – Mittenchops

+1

Eso fue

pero utilicé <> en lugar de > y < - ¡Gracias por la captura! –

+0

@ChuckBergeron O simplemente usa los backticks para indicar el uso del código. Lo solucioné por ti. ;) –

3

Ayudantes sólo deben contener lógica para la vista

modelos deben contener únicamente la lógica relacionada con el objeto modelado, no relacionados con la transacción a cabo ni la vista renderizada

6

Lo mejor es utilizar ayudantes cuando el código que el ayudante está creando para que se muestre solo en la vista. Por ejemplo, si usted quiere tener métodos que ayudan a crear enlaces HTML, que debe ir en el helper:

def easy_link user 
    link_to(user.name, user) 
end 

Si el código es la lógica de negocio que debe ir en sus modelos. También debe tratar de poner tanta lógica de negocios en sus modelos, no quiere este código en sus puntos de vista y controladores. Por ejemplo, si desea procesar un pedido, que el código debe ir en el modelo:

def process 
    raise NotReadyToProcess unless ready_to_process? 
    raise NotValidPaymentDetails unless valid_payment_details? 
    process_payment 
end 
Cuestiones relacionadas