簡體   English   中英

Rails:“渲染模板”實際意味着什么

[英]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.

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