2016-12-17 15 views
0

В моем драгоценном камне у меня есть класс, называемый Client, что я хочу работать так:неверного числа ошибок аргументов при построении змеевидной Руби апи

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

Это означает, что я хочу, чтобы установить свойство, а затем ожидать немедленно верните его в ту же цепочку. Это то, что я до сих пор:

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 

Теперь, когда я пытаюсь запустить client.content_type('pages').content_type я получаю:

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

Что я делаю неправильно? Как мне написать это правильно?

ответ

1

Имена ваших методов противоречат друг другу. Второй метод переопределяет первый. Либо использовать разные имена или консолидировать, чтобы сделать оба типа:

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, этот код воняет. Вы не должны этого делать, если у вас нет веских оснований.

+0

Возможно, вы поможете мне улучшить код? Как выглядел бы лучший дизайн? –

+1

@Amit Я предлагаю, чтобы 'content_type' должен быть' attr_accessor' вашего класса, поэтому вы могли бы делать страницы client.content_type = "pages" или 'client.content_type # output" '' ''. –