2016-12-17 2 views
0

Dans mon petit bijou que j'ai une classe appelée Client que je veux fonctionner comme ceci:mauvais nombre d'arguments erreur lors de la construction d'un api rubis chainable

client = Client.new 
client.content_type('pages').content_type 

Cela signifie que je veux définir une propriété puis attendre à immédiatement le récupérer dans la même chaîne. Voilà ce que j'ai jusqu'à présent:

class Client 
    attr_reader :content_type 

    def initialize(options = {}) 
    @options = options 
    end 

    def content_type 
    @content_type 
    end 

    def content_type(type_id) 
    @content_type = type_id 
    self 
    end 
end 

Maintenant, quand je tente de lancer client.content_type('pages').content_type je reçois:

wrong number of arguments (given 0, expected 1) (ArgumentError) 
    from chaining.rb:16:in `<main>' 

Qu'est-ce que je fais mal? Comment est-ce que j'écris ceci correctement?

Répondre

1

Les noms de vos méthodes sont en conflit. La deuxième méthode remplace la première. Soit utiliser des noms différents ou consolider pour faire les deux comme:

class Client 
    attr_reader :content_type 

    def initialize(options = {}) 
    @options = options 
    end 

    def content_type(type_id = nil) 
    type_id ? @content_type : set_content_type(type_id) 
    end 

    def set_content_type(type_id) 
    @content_type = type_id 
    self 
    end 
end 

Btw, ce code pue. Vous ne devriez pas le faire, sauf si vous avez une bonne raison de le faire.

+0

Pourriez-vous m'aider à améliorer le design de code? A quoi ressemblerait un meilleur design? –

+1

@Amit Je suggère que 'content_type' soit' attr_accessor' de votre classe, donc vous pouvez faire 'client.content_type =" pages "' ou 'client.content_type # output" pages "'. –