渲染和渲染部分与产量之间的差异

时间:2013-05-29 19:59:10

标签: ruby-on-rails ruby-on-rails-3.2

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

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

<%=render 'layouts/footer' %>

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

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

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

在其他地方,我看到<%= yield :sidebar %>

那么这个yield也会在其位置插入HTML?好吧render正在做什么?

我希望如果有另一个程序员而不是书籍向我解释这个可能我这次得到了它:)

3 个答案:

答案 0 :(得分:99)

render&amp; render partial:

  • render 'some_view'render partial: 'some_view'
  • 的简写
  • render file: 'view'会查找文件view.html.erb而非_view.html.erb.erb或您使用的任何其他渲染器)
  • render不接受部分的其他局部变量,您需要使用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&amp; content_for

  • yield通常用于布局。它告诉Rails将此块的内容放在 放置在布局中。
  • yield :something相关联的content_for :something时,您可以传递一段代码(视图)来显示放置yield :something的位置(参见下面的示例)。

关于收益的一个小例子:

在你的布局中:

<html>
<head>
 <%= yield :html_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 :html_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>

可能有用的帖子

指向文档的链接&amp;引导件

答案 1 :(得分:3)

关于渲染,渲染:局部和屈服

  • 渲染:模板和渲染:部分是rails中的两个文件..


    渲染:模板主要根据语法demo.html.erb为

    的动作创建

    render:partial是可重用的并且从不同的视图调用,在应用程序的许多页面之间共享,语法是_demo.html.erb

  • 收益和渲染..


Yield是一种使用其输出调用代码块的方法,但render将包含一个调用它的部分页面模板。在rails中,yield主要用于布局,而render用于动作或其模板

答案 2 :(得分:-1)

一些开发人员认为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

使用此表单中的代码,如果@book变量为nil,则可能会出现问题。请记住,render :action不会在目标操作中运行任何代码,因此不会设置索引视图可能需要的@books变量。解决此问题的一种方法是重定向而不是渲染:

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请求show动作,控制器发现没有书籍,因此控制器发出302重定向响应到浏览器告诉它转到/ 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实例变量,然后直接呈现index.html.erb模板,使用flash将其返回到浏览器警告信息告诉用户发生了什么。