渲染和渲染部分和产量的区别

我从Rails指南中看过,看了看Micheal Hartel的书,现在从Rails的书中读到它,但我仍然感到困惑:(

有一个_footer.html.erb文件,所以它是一个“部分”,并在它写的代码:

 <%=render 'layouts/footer' %> 

所以我的理解是,当它看到这个,在这里插入页脚文件的HTML。 好吧…现在几页之后,它说:

 <%= render partial: 'activitiy_items/recent' %> 

那么为什么这次我们在这里有“部分”这个词,但是我们之前没有这个词?

还有其他地方我看到<%= yield :sidebar %>

所以这个yield也插入HTML的地方? 那么render在做什么呢?

我希望如果另一个程序员,而不是书籍向我解释这个也许我这次得到它:)

renderrender 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

yieldcontent_for

  • yield通常用于布局 。 它告诉Rails把这个块的内容放在布局中的那个地方。
  • 当你确实yield :somethingcontent_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的代码,如果@bookvariables为零,可能会有问题。 请记住, 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模板,并将其返回到浏览器并带有闪烁警报消息告诉用户发生了什么事。