2016-07-02 4 views
1

Ich bin relativ neu in Meta-Programmierung und ich versuche, Getter und Setter bei Kindern Modellen unter einer einzigen Tabelle Vererbung zu definieren, etwa so:Erstellen von benutzerdefinierten Getter und Setter dynamisch unter STI in Rails

# app/models/player.rb 
class Player < ActiveRecord::Base 
    serialize :equipments 

    protected 
    # Define getters for setters for individual sports 
    def attr_equipments(*attributes) 
    attributes.each do |attribute| 
     define_singleton_method(attribute) do 
     self.equipments[attribute.to_sym] 
     end 

     define_singleton_method("#{attribute}=") do |value| 
     self.equipments[attribute.to_sym] = value 
     end 
    end 
    end 
end 

# app/models/baseball_player.rb 
class BaseballPlayer < Player 
    after_initialize do 
    attr_equipments :bat, :glove 
    end 
end 

Auf einem ich höhere Schicht möchte, so etwas tun:

# app/controllers/baseball_players_controller.rb 
class BaseballPlayersController < ApplicationController 
    def new 
    @baseball_player = BaseballPlayer 
    end 
end 

# app/views/baseball_players/new.html.haml 
=form_for(@baseball_player) do |f| 
    =f.text_field :bat 
    =f.text_field :glove 
    =f.submit 

Aber mit dem obigen Beispiel kann ich nicht bekommen oder die Attribute auch von der Konsole eingestellt.

> p = BaseballPlayer.new 
> p.bat 
> # returns NoMethodError: undefined method `[]' for nil:NilClass 

> p = BaseballPlayer.new 
> p.bat = "Awesome bat" 
> # returns ArgumentError: wrong number of arguments (0 for 2..3) 

Kann mir jemand helfen, die richtige Richtung zu finden? Vielen Dank im Voraus.

+0

es heißt, nil ist, was job_arguments sieht ... –

Antwort

0

ich die Frage mich nur gelöst ..

Für zukünftige Referenzen, ist dieser Teil sein Geschäft benötigt als serialize definiert nicht automatisch alle Zugriffsmethoden.

# app/models/player.rb 
class Player < ActiveRecord::Base 
    # serialize :equipments -> does not create a setter or getter needed 
    store :equipments 

begegnete ich auch einen Fehler in der Methode im Controller erstellen:

def create 
    @alarm = BaseballPlayer.new(alarm_params) 
    # Error: undefined attribute 'bat' 

, die durch gelöst wurde:

def create 
    @alarm = BaseballPlayer.new 
    @alarm.assign_attributes(alarm_params)