Daré otro ejemplo que he utilizado. Tengo un método user_params que devuelve los parámetros necesarios para guardar para el usuario (este es un proyecto de Rails)
def user_params
params.require(:user).permit(
:first_name,
:last_name,
:email,
:address_attributes
)
end
Puede ver que no devuelvo nada, pero ruby devuelve el resultado de la última línea.
Luego, después de algún tiempo, necesitaba agregar un nuevo atributo condicionalmente. Entonces, lo cambié a algo como esto:
def user_params
u_params = params.require(:user).permit(
:first_name,
:last_name,
:email,
:address_attributes
)
u_params[:time_zone] = address_timezone if u_params[:address_attributes]
u_params
end
Aquí podemos usar tap para eliminar la variable local y eliminar el retorno:
def user_params
params.require(:user).permit(
:first_name,
:last_name,
:email,
:address_attributes
).tap do |u_params|
u_params[:time_zone] = address_timezone if u_params[:address_attributes]
end
end
User.new.tap &:foobar
user = User.create!(username: 'foobar')
sería más claro y más corto en este caso :) - el último ejemplo de la pregunta.user
". Además, el argumento de que "Un lector no tendría que leer lo que hay dentro del bloque para saber queuser
se crea una instancia ". no tiene peso, porque en el primer bloque de código, el lector también necesita leer la primera línea "para saber queuser
se crea una instancia ".