2009-07-28 2 views
4

при визуализации: xml in rails Я всегда хочу: dasherize => false options. Есть ли способ установить его широкое применение по умолчанию, без необходимости, конечно, изменить исходный код рельсов?«patch» rails render функция для редактирования параметров по умолчанию

возможно вынести функцию, которая каким-то образом имеет преимущество над первой, а затем вызывает его с этой опцией ...

+0

надеюсь, что он не должен разорвать любую другую часть приложения, использующую функцию рендеринга ... он должен работать таким образом только при вызове контроллера (я думаю, что это единственное место, из которого оно вызвано). – luca

ответ

4

Делать что-то вроде это есть оборотная сторона потенциально может привести к неожиданному поведению, когда кто-то приходит, чтобы посмотреть на ваш код (т. е. пока они не обнаружат ваш переопределенный метод, они могут задаться вопросом, почему он ведет себя как dasherize false, если это явно не указано). Тем не менее, в ApplicationController или одном из ваших конкретных контроллеров вы можете переопределить метод рендеринга.

например. что-то вроде:

class MyController < ApplicationController 
    def render(options = nil, extra_options = {}, &block) 
    options ||= {} # initialise to empty hash if no options specified 
    options = options.merge(:dasherize => false) if options[:xml] 
    super(options, extra_options, &block) 
    end 
end 

Если вы хотите, чтобы dasherize еще быть переопределение в ваших звонков, чтобы сделать вы можете сделать Hash слияния в другом направлении, например,

options = {:dasherize => false}.merge(options) 
+0

Я столкнулся с проблемами с этим, если я создаю страницу с директивой: render 'show.xml.builder',: layout => false. Опции - это строка вместо хеша. Я поставил чек, чтобы убедиться, что это хэш, но это похоже на хак. Любые другие предложения? –

+0

Кажется разумным сделать условие 'if' в' if options.is_a? Хеш и ooptions [: xml] 'Кроме того, вы можете использовать блок' begin'/'обеспечить' с вызовом' super' в 'sure'. – mikej

3

Вы также можете попробовать гуманную так:

alias_method_chain :render, :no_dasherize 

def render_with_no_dasherize(options = nil, extra_options = {}, &block) 
    new_options = options 
    new_options = {:dasherize=>false}.merge(options) if(options[:xml]) 
    render_without_no_dasherize(new_options, extra_options, &block) 
end 

Вы можете поместить его в контроллере Application (так все контроллеров будут afected) или только в конкретном контроллере.

+2

Это хорошая практика, так как вы можете получить доступ к функции overriden некоторое время;) –

Смежные вопросы