渲染和渲染部分和产量的区别
我从Rails指南中看过,看了看Micheal Hartel的书,现在从Rails的书中读到它,但我仍然感到困惑:(
有一个_footer.html.erb
文件,所以它是一个“部分”,并在它写的代码:
<%=render 'layouts/footer' %>
所以我的理解是,当它看到这个,在这里插入页脚文件的HTML。 好吧…现在几页之后,它说:
<%= render partial: 'activitiy_items/recent' %>
那么为什么这次我们在这里有“部分”这个词,但是我们之前没有这个词?
还有其他地方我看到<%= yield :sidebar %>
所以这个yield
也插入HTML的地方? 那么render
在做什么呢?
我希望如果另一个程序员,而不是书籍向我解释这个也许我这次得到它:)
render
和render partial:
-
render 'some_view'
是render partial: 'some_view'
的简写render partial: 'some_view'
。 -
render file: 'view'
将查找文件view.html.erb
而不是_view.html.erb
(.erb
或任何其他使用的渲染器) -
render
将不会接受额外的局部variables部分,你需要使用render partial:
如下所示:render partial: 'some/path/to/my/partial', locals: { custom_var: 'Hello' }
( http://guides.rubyonrails.org/layouts_and_rendering.html#passing-local-variables )
yield
& content_for
-
yield
通常用于布局 。 它告诉Rails把这个块的内容放在布局中的那个地方。 - 当你确实
yield :something
与content_for :something
相关联的content_for :something
,你可以传递一段代码(view)来显示yield :something
的位置(见下面的例子)。
关于收益的一个小例子:
在你的布局中:
<html> <head> <%= yield :javascript_head %> </head> <body> <div id="sidebar"> <%= yield :sidebar %> </div> </body>
在你看来:
<% content_for :sidebar do %> This content will show up in the sidebar section <% end %> <% content_for :javascript_head do %> <script type="text/javascript"> console.log("Hello World!"); </script> <% end %>
这将产生以下HTML:
<html> <head> <script type="text/javascript"> console.log("Hello World!"); </script> </head> <body> <div id="sidebar"> This content will show up in the sidebar section </div> </body>
可能有帮助的post :
- embedded式Ruby – 渲染与收益?
- 呈现@object和本地人vs渲染:部分
- Rails新手:关于收益
链接到文档和指南 :
关于渲染,渲染:部分和产量
-
渲染:模板和渲染:部分是在rails中的两个文件..
渲染:模板大部分是根据语法demo.html.erb的动作创build的
渲染:部分是可重用的,从不同的视图调用,在应用程序中的许多页面之间共享,语法是_demo.html.erb
-
产量和呈现..
Yield是一种用其输出调用代码块的方法,但是渲染将包含调用它的部分页面模板。 在rails中,yield主要用于布局,而render则用在动作或模板中
有些开发人员认为redirect_to是一种goto命令,在Rails代码中将执行从一个地方移动到另一个地方。 这是不正确的。 您的代码停止运行,并等待浏览器的新请求。 恰好你已经通过发送一个HTTP 302状态码告诉浏览器接下来应该发出什么请求。
考虑这些行动,看看不同之处:
def index @books = Book.all end def show @book = Book.find_by(id: params[:id]) if @book.nil? render action: "index" end end
用这种forms的代码,如果@book
variables为零,可能会有问题。 请记住, render :action
不会在目标操作中运行任何代码,因此没有任何操作可以设置索引视图可能需要的@booksvariables。 解决这个问题的一种方法是redirect而不是渲染:
def index @books = Book.all end def show @book = Book.find_by(id: params[:id]) if @book.nil? redirect_to action: :index end end
使用这段代码,浏览器将会重新索引索引页面,索引方法中的代码将会运行,并且一切都会好的。
这个代码唯一的缺点是它需要往返浏览器:浏览器请求/ books / 1的显示操作,并且控制器发现没有图书,所以控制器向浏览器发送302redirect响应告诉它去/ books /,浏览器遵循并发送一个新的请求回到控制器询问索引动作,然后控制器获取数据库中的所有书籍并呈现索引模板,并将其发送回浏览器然后显示在你的屏幕上。
而在一个小应用程序中,这个额外的延迟可能不是问题,如果响应时间是一个问题,这是一个需要考虑的问题。 我们可以通过一个人为的例子来演示一种处理方法:
def index @books = Book.all end def show @book = Book.find_by(id: params[:id]) if @book.nil? @books = Book.all flash.now[:alert] = "Your book was not found" render "index" end end
这将检测到没有指定ID的书籍,使用模型中的所有书籍填充@books实例variables,然后直接渲染index.html.erb模板,并将其返回到浏览器并带有闪烁警报消息告诉用户发生了什么事。