rails - ruby openstruct vs struct




L'utilisation de structures dans Ruby on Rails permet une affectation constante dynamique(SyntaxError) (2)

L'erreur explique le problème - vous avez une constante assignée dans un contexte trop dynamique - c'est-à-dire dans la méthode d'index.

La solution est de le définir à l'extérieur:

DashItem = Struct.new(:name, :amount, :moderated)
def index
  @dashboard_items = []
  ...

Dans mon contrôleur, j'ai le code simplifié suivant:

def index
  @dashboard_items = []
  DashItem = Struct.new(:name, :amount, :moderated)  # Error is here

  [:page, :post].each do |c|
    obj = c.to_s.capitalize.constantize
    @dashboard_items << DashItem.new(c.to_s, obj.count, obj.count_moderated)
  end
end

Mais Ruby donne l'erreur suivante:

affectation constante dynamique (SyntaxError)

sur la ligne marquée ci-dessus.

Qui, AFAIK, signifie que la constante DashItem est déjà définie. Est-ce correct? Et que faire à propos de ça?


Si vous voulez garder le tout parfaitement dans votre méthode d'indexation, vous pouvez le faire:

def index
  @dashboard_items = []
  # Set the name of your struct class as the first argument
  Struct.new('DashItem', :name, :amount, :moderated)
  ...
  # Then when you want to create an instance of your structure
  # you can access your class within the Struct class
  @dashboard_items << Struct::DashItem.new(c.to_s, obj.count, obj.moderated)
end

Comme Gunn l'a dit, vous ne pouvez simplement pas attribuer explicitement une constante dans une méthode comme celle-ci ...

Cette solution est expliquée davantage dans les ruby ​​docs here , deuxième exemple sur la page.







struct