ruby-on-rails – Rails:“渲染模板”实际上意味着什么

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails:“渲染模板”实际上意味着什么前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
由于作者在我正在阅读的书中谈论它的方式,我对“渲染”“模板”的想法感到有点困惑.

我对“渲染模板”的原始理解是,它意味着Rails提供在屏幕上查看/呈现给观众的内容(以部分呈现的方式),但我正在阅读的书似乎是使用“渲染模板”的概念也意味着别的东西.让我在上下文中解释一下

本书(rails 3 in action)使用传统的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 =>是的,但随后他修改了这个动作,因为正如他所说,“你将会得到它来渲染模板.”这是我感到困惑的地方

获取此动作的模板是“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模板(我无法想象为什么).

猜你在找的Ruby相关文章