2015-11-16 6 views
13

Ich arbeite an einer RubyonRails/ActiveAdmin-Anwendung. Meine RoR-Version ist 4.2.5 und AA-Version ist 1.0.0. Ich habe ein Modell Message wie folgt.Wie fügt man einem Modell in Ruby on Rails ein virtuelles Attribut hinzu?

class Message < ActiveRecord::Base 

    belongs_to :user 
    validates :user, :content, presence: true 

    def palindrome 
    # return true/false 
    end 

end 

Wie Sie sehen, ich will einen schreibgeschützten haben palindrome zuzuschreiben, die auf der content der Nachricht hängt nur. Ich möchte, dass dieses Attribut genau wie ein normales Attribut behandelt wird. Normalerweise, ich meine, wenn ich Nachrichten über rails console abrufen oder json Format der Nachrichten anfordern, möchte ich ein palindrome Attribut in der Liste sehen. Ich möchte auch einen Filter für Nachrichten durch dieses Attribut haben.

Ich bin nicht sicher, wie ich das erreichen könnte.

Antwort

10

In Ihrem Modell, Sie schreiben können Accessoren (Leser/Schreiber) für die virtuelle Attribut Attribut palindrome auf diese Weise Attribut:

# attr_reader 
def palindrome 
    self[:palindrome] 
end 

# attr_writer 
def palindrome=(val) 
    self[:palindrome] = val 
end 

# virtual attribute 
def palindrome 
    #return true/false 
end 

Und wie Sie Rails verwenden 4, Sie haben palindrome Attribut auf die weiße Liste wie ein beliebiges anderes Modellattribut in Ihrer starken Param-Definition in Ihrem Controller, um den Wert palindrome in der Masse zuweisen zu können. Etwas wie folgt aus:

# your_controller.rb 
private 

def your_model_params 
    params.require(:message).permit(:palindrome) 
end 

Werfen Sie einen Blick auf diese RailsCast on Virtual Attributes. Obwohl, es ist ein bisschen alt, aber wäre nützlich für Konzepte.

Hinweis:

Ein virtuelles Attribut wird nicht automatisch in der param Liste angezeigt. Sie sollten jedoch über die Rails-Konsole darauf zugreifen können: Message.new.palindrome. Sie können dieses virtuelle Attribut auch in Ihrer JSON-API verfügbar machen. Wenn Sie z. B. Active Model Serializer verwenden, können Sie attribute palindrome in Ihrem MessageSerializer und dann palindrome der JSON-API verfügbar machen.

+0

Nun, Danke. Ich habe zwei Fragen. Erstens möchte ich nicht, dass dieses Attribut beschreibbar ist, da es nur vom Wert eines anderen Attributs abhängt. Zweitens, was bewertet "self [: palindrome]"? – moorara

+0

Wenn Sie den Attributwert nicht schreiben müssen, dann verwenden Sie nicht die Setter-Methode und die Whitelisting in Ihrer Definition für starke Parameter. 'self [: palindrome]' gibt Ihnen den Wert des Palindroms von 'self', das die Instanz Ihres Modellobjekts ist. Dies ist ähnlich wie "model_instance.palindrome". Hoffe es ist jetzt klar. Lass es mich wissen, wenn du andere Fragen hast. –

+0

Sind Sie sicher, dass dies in der Liste angezeigt wird? –

15

Rails eigentlich wir Sie virtuelle Attribute auf diese Weise erstellen, die Sie davon ab, hält manuell Getter und Setter-Methoden zu erstellen:

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

Sie auch mehrere Argumente zu übergeben können:

attr_accessor :palindrome, :foo, :bar