2011-04-14 11 views
11

mayoría de los carriles tutoriales muestran cómo rellenar una clase del modelo a través del hash params así:Creación de modelo de rieles ActiveRecord a partir de hash params

class UsersController < ApplicationController 
    def create 
     @user = User.create(params[:user]) 

     # more logic for saving user/redirecting/etc.  
    end 
end 

Esto funciona muy bien si se supone que todos los atributos en su modelo a ser cadenas. Sin embargo, ¿qué ocurre si se supone que algunos de los atributos son entradas o fechas o algún otro tipo?

Por ejemplo, digamos que la clase de usuario se parece a esto

class User < ActiveRecord::Base 
    attr_accessible :email, :employment_start_date, :gross_monthly_income 
end 

el atributo: correo electrónico debe ser una cadena, el atributo: employment_start_date debe ser una fecha, y el: gross_monthly_income debe ser un decimal. Para que estos atributos sean del tipo correcto, ¿necesito cambiar la acción de mi controlador para que se vea algo así?

class UsersController < ApplicationController 
    def create 
     @user = User.new 
     @user.email = params[:user][:email] 
     @user.employment_start_date = params[:user][:employment_start_date].convert_to_date 
     @user.gross_monthly_income = params[:user][:gross_monthly_income].convert_to_decimal 

     # more logic for saving user/redirecting/etc. 
    end 
end 
+0

¿Estás seguro de que params [: user] tendrá todas las cadenas? Creo que hash de params se convertirá correctamente cuando lo uses con AR. – rmk

+0

@rmk Sí, tienes razón. Agregué una respuesta a continuación básicamente diciendo lo mismo. Lo marcaría como la respuesta aceptada, pero tengo que esperar 2 días antes de poder marcar mi propia respuesta como aceptada. –

Respuesta

7

De acuerdo con ActiveRecord documentation, los atributos se deben escribir automáticamente en función de los tipos de columna en la base de datos.

5

De hecho, me añadir una devolución de llamada before_save en su modelo de usuarios para asegurarse de que los valores que desea están en el formato es decir correcta:

class User < ActiveRecord::Base 
    before_save :convert_values 

    #... 

    def convert_values 
    gross_monthly_income = convert_to_decimal(gross_monthly_income) 
    #and more conversions 
    end 

end 

lo que sólo puede llamar User.new(params[:user]) en su controlador, que sigue el lema "Mantenga sus controladores delgados"

+0

Parece que debería funcionar. ¿Es esta la "manera de los rieles" de hacer esto? Parece una situación que surgiría muy a menudo, pero por mi vida no puedo encontrar ningún tutorial/guía que lo muestre. –

+0

Agregué una nueva versión que me gusta más. –

+0

Me gusta la versión before_save. Cuestión sin embargo: de acuerdo con [este] (http://stackoverflow.com/questions/2685226/convert-input-to-integer-before-save-in-rails/2685601#2685601), Rails es lo suficientemente inteligente como para hacer la conversión para ti cuando ejecuta algo como @user = User.new (params [: user]). Si ese es el caso, entonces supongo que esto no es necesario. No estoy seguro de si eso es cierto sin embargo. –

Cuestiones relacionadas