2009-07-28 22 views
4

當我渲染時:xml在rails中我總是希望:dasherize => false選項。有沒有辦法將它的應用程序範圍設置爲默認值,而不必修改rails源代碼當然?「patch」rails渲染函數來編輯默認選項

也許渲染功能,不知怎的,優先於第一個,然後用這個選項調用它...

+0

希望它不應該打破使用渲染功能的應用程序的任何其他部分......它應該只有當被控制器調用時才能以這種方式工作(我認爲這是唯一被調用的地方..) – luca 2009-07-28 14:08:40

回答

4

做這樣的事情確實有可能導致意外的行爲下行時別人來看看在你的代碼中(即,直到他們發現你重寫的方法,他們可能會問,爲什麼它沒有被明確指定時,就像dasherize false一樣)。這就是說,在ApplicationController或你的特定控制器之一中,你可以重寫render方法。

例如是這樣的:

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仍處於您的通話覆蓋的渲染,你可以做哈希合併在其他方向如

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

如果我使用指令呈現頁面,則會遇到問題:render'show.xml.builder',:layout => false。選項然後是一個字符串而不是哈希。我放入一張支票以確保它是一個哈希,但它看起來像一個黑客。還有其他建議嗎? – 2012-02-03 17:55:58

+0

似乎是合理的,如果options.is_a會使`if`條件成爲`if?哈希和ooptions [:xml]`或者,您可以在`ensure`中使用帶'super`調用的`begin` /`ensure`塊。 – mikej 2012-02-03 18:20:10

3

您也可以嘗試這樣的sollution:

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 

你可以把它放在應用控制器(因此所有控制器將受其影響),或者只在特定的控制器。