2016-03-28 4 views
1

Я пытаюсь создать простой плагин Ruby on Rails. Когда функция redcarpetable вызывается с хешем для render_opts, я получаю «ArgumentError: unknown keyword: render_opts». Код функции:Ruby ArgumentError: неизвестное ключевое слово, но не знаю почему

def redcarpetable(*fields, renderer: :default, as: [nil], prefix: "rendered", render_opts: {}) 
    fields.each do |field| 
     if fields.count > 1 
     define_method "#{prefix}_#{field}" do 
     Carpet::Rendering.render(read_attribute(field), renderer_opts: render_opts, rc_renderer: renderer).html_safe 
     end # End defining the method dynamically. 
     else 
     if as[0] 
      as.each do |method_name| 
      define_method "#{method_name}" do 
      Carpet::Rendering.render(read_attribute(field), render_opts: render_opts, rc_renderer: renderer).html_safe 
      end # End defining the method dynamically. 
      end 
     else 
      define_method "rendered_#{field}" do 
      Carpet::Rendering.render(read_attribute(field), render_opts: render_opts, rc_renderer: renderer).html_safe 
      end # End defining the method dynamically. 
     end 
     end 
    end # End the fields loop. 
    end # End the redcarpet method. 

Как функция называется:

redcarpetable :name, renderer: :simple_parser, as: [:cool_name, :rendered_name], render_opts: {:generate_toc_data: true} 

Для того, чтобы обеспечить хэш визуализации параметров, что должно быть сделано в объявлении функции? Полный код (еще не задокументированный или реорганизованный) составляет here.

+0

Dunno, как вы получаете ошибку, которую вы получаете, но '{: generate_toc_data: true}' является синтаксической ошибкой (должно быть '{generate_toc_data: true}' или '{: generate_toc_data => true}') – Amadan

ответ

1

Вы вызываете Carpet::Rendering следующим образом:

Carpet::Rendering.render(read_attribute(field), 
    render_opts: render_opts, rc_renderer: renderer 
).html_safe 

Но этот вариант фактически называется renderer_opts. Просто измените его на:

Carpet::Rendering.render(read_attribute(field), 
    renderer_opts: render_opts, rc_renderer: renderer 
).html_safe 

Возможно, вы также захотите изменить его в подписи методов.

1

Я думаю, что ваша проблема может быть вызвана помещением знака *fields перед другими аргументами.

Хотя я специально не уверен, что вызывает вашу ошибку, вы можете получить хеш опций, используя следующий подход:

def redcarpetable(options={}, *fields) 
    defaults = { 
    foo: "bar", 
    bar: "foo" 
    } 
    options= defaults.merge(options) 
    puts options[:foo] # => "bar" 
end 

Таким образом, вы можете установить значения по умолчанию и переопределить их при вызове метода.

В вашем теле метода, вы будете иметь, чтобы ссылаться на переменные с помощью хэш опций, т.е. options[:foo] и не только foo.

Когда вы вызываете метод, если только ничего не передаете *fields, вы собираетесь в включить фигурные скобки в аргументе параметров.

Например:

redcarpetable({foo: bar}, ["field1" "field2"] 

И не:

redcarpetable(foo: bar, ["field1, "field2"] 

Кроме того, если вы передаете любые поля, но не проходя никаких вариантов, вам придется включить пустые скобки:

redcarpetable({}, ["field1", "field2"])