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.
es heißt, nil ist, was job_arguments sieht ... –