Lea*_*cim 8 model-view-controller ruby-on-rails
由于作者在我正在阅读的书中谈论它的方式,我对"渲染""模板"的想法感到有点困惑.
我对"渲染模板"的原始理解是,它意味着Rails提供在屏幕上查看/呈现给观众的内容(以部分呈现的方式),但我正在阅读的书似乎是使用"渲染模板"的概念也意味着别的东西.让我在上下文中解释一下
本书(使用rails 3)使用传统layouts/application.html.erb文件设置页面布局,然后它"产生"到不同的视图页面,例如 views/tickets/show.html.erb向屏幕添加更多内容.这一切都很简单..
在这个视图中views/tickets/show.html.erb,有一个局部渲染(这也是一个简单的概念).
<div id='tags'><%= render @ticket.tags %></div>
Run Code Online (Sandbox Code Playgroud)
现在,在这部分内部,使用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 %>
Run Code Online (Sandbox Code Playgroud)
现在这里是标签控制器中的"删除"操作(它将标签与数据库中的票证解除关联)...
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
Run Code Online (Sandbox Code Playgroud)
在此删除操作结束时,作者最初包括在内render :nothing => true,但后来他修改了操作,因为正如他所说的那样,"你将获得它来渲染模板." 这是我感到困惑的地方
他获取此动作的模板是"remove.js.erb",其中只有一行jquery,其目的是从页面中删除"标记"(即用户在标记上看到的标记)现在它已与数据库中的票证取消关联.
$('#tag-<%= @tag.name.parameterize %>').remove();
Run Code Online (Sandbox Code Playgroud)
当我阅读"渲染模板"时,我希望应用程序将内容插入到页面中,但是控制器中"remove"操作呈现的模板只调用一个jquery函数,该函数从页面中删除一个元素.
如果"模板"被"渲染",我希望删除另一个模板(为了为新模板腾出空间),或者我希望内容能够以部分渲染的方式"渲染" .在这个问题中使用jquery的情况下,"模板"被"渲染"时,你能澄清一下实际发生了什么吗?它实际上是在用户面前放置一个新页面(我希望呈现某种物理页面)
你快到了!渲染模板确实总是与生成内容有关,但是是为了对内容进行更广泛的描述。它可能是一段 html,例如获取新项目的 ajax 调用可能会生成一些描述新项目的 html,但不一定如此。
模板可能会生成 javascript,就像第二个示例中那样。就我个人而言,我试图避免这种情况,而是将 JSON 传递回客户端,让客户端 js 执行所需的工作。
您可能执行的另一种渲染类型是生成一些 JSON。API 通常会执行此操作,但您也可以在普通页面上执行此操作。例如,您可以渲染 json,而不是渲染一些 javascript 来删除标签 x
{ to_delete: "tag-123"}
Run Code Online (Sandbox Code Playgroud)
然后让 jQuery 成功回调使用该有效负载来知道要从 DOM 中删除哪个元素,方法是将其放在 application.js 文件中
$('a.delete_tag').live('ajax:success', function(data){
var selector = '#' + data.to_delete;
$(selector).remove()
}
Run Code Online (Sandbox Code Playgroud)
(假设您的删除链接具有“delete_tag”类)像这样呈现 JSON 根本不是真正的模板,因为您通常通过以下方式执行此操作
render :json => {:to_delete => "tag-#{@tag.name.parameterize}"}
Run Code Online (Sandbox Code Playgroud)
虽然我想你可以使用 erb 模板(但我无法想象为什么)。
| 归档时间: |
|
| 查看次数: |
3238 次 |
| 最近记录: |