![](/img/trans.png)
[英]What does this mean “Missing template” (ruby, rails 4, devise 2)?
[英]Rails: What does it actually mean to “render a template”
由於作者在我正在閱讀的書中談論它的方式,我對“渲染”“模板”的想法感到有點困惑。
我對“渲染模板”的原始理解是,它意味着Rails提供在屏幕上查看/呈現給觀眾的內容(以部分呈現的方式),但我正在閱讀的書似乎是使用“渲染模板”的概念也意味着別的東西。 讓我在上下文中解釋一下
本書(使用rails 3)使用傳統的layouts/application.html.erb
文件設置頁面布局,然后它“生成”到不同的視圖頁面,例如views/tickets/show.html.erb
,這增加了更多內容到屏幕。 這一切都很簡單..
在這個視圖中, views/tickets/show.html.erb
中有一個部分渲染(這也是一個簡單的概念)。
<div id='tags'><%= render @ticket.tags %></div>
現在,在這部分內部,使用ajax,調用“tags_controller.rb”中的“remove”方法,該方法旨在允許授權用戶從我們的模擬項目管理應用程序中的“票證”中刪除“標記”。
<% if can?(:tag, @ticket.project) || current_user.admin? %>
<%= link_to "x", remove_ticket_tag_path(@ticket, tag),
:remote => true,
:method => :delete,
:html => { :id => "delete-#{tag.name.parameterize}" } %>
<% end %>
現在這里是標簽控制器中的“刪除”操作(它將標簽與數據庫中的票證解除關聯)...
def remove
@ticket = Ticket.find(params[:ticket_id])
if can?(:tag, @ticket.project) || current_user.admin?
@tag = Tag.find(params[:id])
@ticket.tags -= [@tag]
@ticket.save
end
end
end
在此刪除操作結束時,作者最初包含了render :nothing => true
,但隨后他修改了操作,因為正如他所說,“你將獲得它來渲染模板。” 這是我感到困惑的地方
他獲取此動作的模板是“remove.js.erb”,其中只有一行jquery,其目的是從頁面中刪除“標記”(即用戶在其上看到的標記)現在它已與數據庫中的票證取消關聯。
$('#tag-<%= @tag.name.parameterize %>').remove();
當我閱讀“渲染模板”時,我希望應用程序將內容插入到頁面中,但是控制器中“remove”操作呈現的模板只調用一個jquery函數,該函數從頁面中刪除一個元素。
如果“模板”被“渲染”,我希望刪除另一個模板(為了為新模板騰出空間),或者我希望內容能夠以部分渲染的方式“渲染” 。 在這個問題中使用jquery的情況下,“模板”被“渲染”時,你能澄清一下實際發生了什么嗎? 它實際上是在用戶面前放置一個新頁面(我希望呈現某種物理頁面)
你快到了! 渲染模板確實總是關於生成內容,但是對於內容的稍微更廣泛的描述。 它可能是一大塊html,例如獲取新項目的ajax調用可能會產生一些描述新項目的html,但它不一定是。
模板可能會像第二個示例中那樣生成javascript。 我個人試圖避免這種情況,而是將JSON傳遞回客戶端,讓客戶端js執行所需的工作。
您可能執行的另一種渲染是生成一些JSON。 API通常會這樣做,但您也可以在普通頁面上執行此操作。 例如,您可以渲染json,而不是渲染一些javascript來刪除標記x
{ to_delete: "tag-123"}
然后讓你的jQuery成功回調使用該有效負載來知道從DOM中刪除哪個元素,方法是將它放在application.js文件中
$('a.delete_tag').live('ajax:success', function(data){
var selector = '#' + data.to_delete;
$(selector).remove()
}
(假設你的刪除鏈接有類'delete_tag')這樣渲染JSON根本就不是一個模板,因為你通常會這樣做
render :json => {:to_delete => "tag-#{@tag.name.parameterize}"}
雖然我想你可以使用erb模板(我無法想象為什么)。
我的理解是js.erb
通過執行其中的javascript函數來“渲染”。 經常會出現類似下面的內容:
jQuery(document).ready(function() {
jQuery('#element').html('<%= escape_javascript(render pages/content) %>');
});
在http://guides.rubyonrails.org/layouts_and_rendering.html上有一個非常簡潔的渲染概述可能會有所幫助,因為它還涉及ActionController::Base#render
方法的細節以及使用render :nothing
時幕后發生的情況render :nothing
(例如)。 渲染但也可用於文件或內聯代碼 - 而不僅僅是傳統意義上的“模板”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.