ruby-on-rails - que - getter setter ruby
attr_accessor valores predeterminados (7)
Esto no se hace en attr_accessor, sino en su migración.
Entonces ... podrías realizar una migración
(1) rails g migration ChangePoliticsColumnToDefaultValueFalse
(2) agregue esto en def self.up
def self.up change_column :your_table, :politics, :boolean, :default => 0 end
La conclusión es que los atributos predeterminados se establecen en las migraciones.
¡Espero que esto ayude!
Editar:
También hay algunas preguntas similares que se han respondido bien:
Estoy usando raíles y quiero hacerlo de modo que attr_accessor :politics
esté configurado, por defecto, en falso.
¿Alguien sabe cómo hacer esto y puede explicarlo en términos simples para mí?
He estado usando este formulario en ActiveRecord:
class Song < ActiveRecord::Base
def initialize(*args)
super(*args)
return unless self.new_record?
self.play_count ||= 0
end
end
Podrías usar la gema virtus:
https://github.com/solnic/virtus
Del LÉAME:
Virtus le permite definir atributos en clases, módulos o instancias de clases con información opcional sobre tipos, visibilidad del método lector / escritor y comportamiento de coerción. Es compatible con una gran cantidad de coacciones y mapeo avanzado de objetos incrustados y colecciones.
Admite específicamente valores predeterminados .
Rails tiene attr_accessor_with_default para que pueda escribir
class Like
attr_accessor_with_default :politics,false
end
i = Like.new
i.politics #=> false
y eso es todo
ACTUALIZAR
attr_accessor_with_default ha quedado obsoleto en Rails 3.2 ... puedes hacer esto en cambio con Ruby puro
class Like
attr_writer :politics
def politics
@politics || false
end
end
i = Like.new
i.politics #=> false
Si define su attr_accessor, de manera predeterminada el valor es nil
. ¡Puedes escribirle, haciéndolo así !nil
attr_accessor in rails es solo una variable virtual que no se almacena en la base de datos y solo se puede usar hasta que el registro activo no se guarde o se actualice en la aplicación. Puede definir attr_accessor en modelo como
class Contact < ActiveRecord::Base
attr_accessor :virtual_variable
end
y usar en forma como:
<div class="field">
<%= f.label :virtual %><br>
<%= f.text_field :virtual %>
</div>
y puede encontrar estos valores de variable vartual en el parametro del controlador ...
class Song < ActiveRecord::Base
def initialize(*args)
super(*args)
return unless self.new_record?
self.play_count ||= 0
end
end
En mi opinión, creo que esta respuesta es buena. Aunque estamos anulando el método de inicialización pero como se llama a super en la primera línea de este método, no cambió nada al método de inicialización de clase base, sino que esta es una característica clave de la programación orientada a objetos que podemos anular, y agregar algunos más funcionalidad en el momento de la inicialización de obects. Además, el inicializador no se omitirá al leer objetos de la base de datos, ya que se llama a super en la primera línea de la función.