[英]Rails: Render a View (not a partial) From Within a View
我有一個響應html
和js
的控制器。 html
視圖呈現整個頁面(包括頁眉和頁腳),而js
僅替換#main
。 除了頁眉和頁腳之外,兩種格式都呈現相同的內容。 我可以通過三個文件獲得此效果:
_show.html.erb
<div>Content!</div>
show.html.erb
<%= render "show" %>
show.js.erb
$("#main").fadeIn("<%= escape_javascript(render 'show') %>");
這有效,但我更喜歡如果我不需要單獨的_show
部分。 不幸的是,這不起作用:
show.html.erb
<div>Content!</div>
show.js.erb
$("#main").fadeIn("<%= escape_javascript(render 'show') %>");
由於Rails將查找show
partial,而不是實際視圖。
有沒有辦法讓Rails查找視圖文件,而不是部分?
在另一個視圖中渲染非局部視圖並不完全是Rails Way™。 您當前的解決方案可能更好,而不是一種不常見的方法。 如果您對部分名稱與操作相同感到奇怪,請將其重命名為_body或其他適當的內容。
但是,如果您的視圖可以共享,在這種情況下似乎可以,您可以將其設置為布局。
事實上,如果不存在js
模板,Rails將為js
動作呈現html
模板,這有點違背了最不出意的原則。 這意味着您可以刪除js模板和部分模板,只需創建一個名為的布局,例如fadein.js.erb
:
# yourviews/show.html.erb
<div>Content!</div>
# layouts/fadein.js.erb
$("#main").fadeIn("<%= escape_javascript(yield) %>");
# YourController.rb
def show
# ...
respond_to do |wants|
wants.html
wants.js { render :layout => "fadein" }
end
end
像其他人提到的那樣,在另一個視圖中渲染另一個非局部視圖是“不是軌道方式”,如果你仍然堅持這樣做,一種方法是:
<%= render :file => '<replace with relative/absolute path>' %>
您可以通過評論看到這不是一個好習慣。 Rails具有視圖 , 部分和布局的概念。 也就是說,視圖是你應該只使用一次的視圖。 所以我的建議是:
你只需要將一個上下文傳遞給你的render
方法:
<%= render :template => "show" -%>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.