2011-03-23 40 views
10

我想有一個JSON響應,其中有些價值是由部分JSON ERB模板不能找到其他HTML部分

#projects_Controller.rb 

def index 
    respond_to do |f| 
    f.json 
    end 
end 

# index.json.erb 

    { 
    "html":"<%= raw escape_javascript(render :partial => 'projects/disclaimer') %>" 
    } 

渲染HTML,但我得到以下錯誤:

ActionView::Template::Error (Missing partial projects/disclaimer with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=> 
    [:json], :locale=>[:en, :en]} in view paths "c:/rails/app/views", "c:/rails/vendor/plugins/more/app/views", "C:/Ruby192/lib/ruby/gems/1.9.1/gems/devise-1.1.8/app/views") 

看起來JSON請求在其名稱中使用.json.erb呈現部分內容,但不是.html.erb,這就是我所擁有的。 有沒有辦法讓我指定'html'。

新增: 如果請求是 'JS',並在index.js.erb的我呈現幾乎相同的代碼: #index.js.erb的

disclaimer = { 
    "html":"<%= raw escape_javascript(render :partial => 'projects/disclaimer') %>" 
    } 

它找到項目/免責聲明.html.erb並正確呈現它。我想知道爲什麼會有這樣的不一致性,如果有人要求js,模板中的任何部分渲染將查找partial_name.html.erb,但如果請求json,則部分渲染會要求partial_name.json.erb?

謝謝

回答

13

明白了:所有的人需要的是這條線在.json.erb文件 <%self.formats = 「HTML」]%>

,所以該完整index.json.erb

 <% self.formats = ["html"] %> 
     disclaimer = { 
     "html":"<%= raw escape_javascript(render :partial => 'projects/disclaimer', 
        :content_type => 'text/html'), 
        :locals => {:localVariable => @localVariable} 
       %>" 
     } 
+5

這種方法也可以從呈現JSON的控制器內部工作;我設置了'self.formats = [:html]',然後'render_to_string(:partial =>'an_html_partial',:locals => {:whatever => whatever})',然後我可以渲染json。 – alxndr 2012-03-06 19:52:10

+0

如果你還有其他的json partials,你可能需要'self.formats + = [:html]'來代替。 – 2014-01-31 08:59:32

0

我不知道如果我得到你的權利,但也許你可以與內容類型類似這樣玩:

disclaimer = { 
    "html":"<%= raw escape_javascript(render :partial => 'projects/disclaimer', :content_type => 'text/html'), :locals => {:localVariable => @localVariable} %>" 
} 

的:當地人就是,如果你想通過一個var的部分。

+0

不,不,我認爲你是正確的金錢:Rails是受邀擔任JSON,因此任何它所服務,包括任何渲染將不得不JSON不html.erb。所以當我在響應中詢問partial.html.erb時,它會拋出一個錯誤,指出找不到partial.JSON.erb。奇怪的是,如果我在頭文件中要求.js(JSONP?),這意味着rails應該在.js.erb結尾處提供所有partials,但是這一次,它不介意提供.html.erb並且不會說它沒有被發現。這是我的意見不一致....但添加:content_type =>'文本/ HTML'後,它仍然會拋出相同的錯誤 – 2011-03-23 08:57:28

5

我的答案與上面的Nik類似。我有json.erb模板下面的幫助:

# helpers useful for json.erb templates 
module JsonHelper 

    # Same as render but force actionview to look for html templates instead of json. 
    def render_html(options={}, locals={}, &block) 
    old_formats = formats 
    self.formats = [:html] # hack so partials resolve with html not json format 
    render options, locals, &block 

    ensure 
    self.formats = old_formats 
    end 

    # json escape a string. For example <%=json "some { string }" %> 
    def json(value) 
    raw value.to_json 
    end 
end 

所以,現在我可以寫模板像

{ 
    "html": <%=json render_html(:partial => 'some_partial') %>, 
    "status": success 
} 

如果允許的ActionView在23tux的例子有CONTENT_TYPE呈現類似這樣會更好(其沒有按不爲我工作)。如果只有* .html.erb經歷了html轉義而不是所有的* .erb文件,它也會更好。

1

對於未來的讀者,您可以傳遞像這樣的格式參數。

= render partial: 'user', locals: {xyz: @xyz}, :formats => [:html]