簡體   English   中英

Rails:從視圖中渲染視圖(不是部分視圖)

[英]Rails: Render a View (not a partial) From Within a View

我有一個響應htmljs的控制器。 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具有視圖部分布局的概念。 也就是說,視圖是你應該只使用一次的視圖。 所以我的建議是:

  1. 如果您覺得可以在當前視圖中呈現多個額外視圖,那么您很可能正在尋找布局
  2. 如果您認為您的某個視圖應該在許多頁面中呈現,那么您正在尋找一個部分視圖
  3. 如果此視圖應該只在其中呈現一個額外視圖,並且該視圖應僅在當前視圖內呈現,則可以選擇上述任何一個 選擇任何 一個 - 就是這樣,使用單個文件

你只需要將一個上下文傳遞給你的render方法:

<%= render :template => "show" -%>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM