seguridad relaciones rails proyecto mundo modelos modelo librosweb hola español ruby-on-rails ruby ruby-on-rails-4 activeadmin

relaciones - ¿Cómo agregar un atributo virtual a un modelo en Ruby on Rails?



ruby on rails pdf español (2)

Estoy trabajando en una aplicación RubyonRails / ActiveAdmin. Mi versión RoR es 4.2.5 y la versión AA es 1.0.0. Tengo un Message modelo de la siguiente manera.

class Message < ActiveRecord::Base belongs_to :user validates :user, :content, presence: true def palindrome # return true/false end end

Como ve, quiero tener un palindrome atributo de solo lectura que solo depende del content del mensaje. Quiero que este atributo sea tratado exactamente como un atributo normal. Por normal, me refiero a que cuando recupero mensajes a través de la rails console o solicito el formato json de mensajes, quiero ver un atributo palindrome en la lista. También me gustaría tener un filtro para el mensaje por este atributo.

No estoy seguro de cómo podría lograr esto.


En su modelo, puede escribir accesores de atributos (lector / escritor) para su atributo de palindrome atributo virtual de esta manera:

# attr_reader def palindrome self[:palindrome] end # attr_writer def palindrome=(val) self[:palindrome] = val end # virtual attribute def palindrome #return true/false end

Y, como está usando Rails 4, tiene que incluir en la lista blanca el atributo palindrome como cualquier otro atributo de modelo en su definición de parámetro fuerte dentro de su controlador para poder asignar en masa el valor de palindrome . Algo como esto:

# your_controller.rb private def your_model_params params.require(:message).permit(:palindrome) end

Eche un vistazo a este RailsCast en los atributos virtuales . Aunque, es un poco viejo, pero sería útil para los conceptos.

Nota:

Un atributo virtual no aparecerá en la lista de parámetros automáticamente. Pero, debería poder acceder a él a través de la consola de Rails de esta manera: Message.new.palindrome . Además, puede exponer este atributo virtual en su JSON API, por ejemplo, si está utilizando Active Model Serializer , puede tener: attribute palindrome en su MessageSerializer y luego palindrome estará expuesto al JSON API.


Rails en realidad te permite crear atributos virtuales de esta manera, lo que evita que tengas que crear manualmente métodos de obtención y establecimiento:

attr_reader :palindrome #getter attr_writer :palindrome #setter attr_accessor :palindrome #both

También puede pasar varios argumentos también:

attr_accessor :palindrome, :foo, :bar