`

rails 局部模板 partial render 介绍

阅读更多

需要用这样的形式来使用:render :partial => ‘path/filename’。应当注意的是,相应的模板(.rhtml)文件该保存为“_”开头的。比如我的模板文件在app/views/book /_search_form.rhtml,若在BookController的方法中调用时,直接用

render :partial => ’search_form’

若在别的控制器中,则需要

render :partial => ‘book/search_form’

rails中的redirect 和 render区别

Rails里

1. render 和 redirect 只能用一个

2. render 可以翻译成提交,一般的电脑语言翻译成渲染,Rails里render可以自动方式和手动两种

3. 动作控制器通过render方法发送内容给用户,大多数都是提交一个“模板”。视图可以看懂erb的模板,显示出@变量(实例变量)----这种render提交和渲染(把模板呈现为用户看到的视图)过程是自动的,不用你命令render去执行

简单说就是controller中方法里定义的@foo变量,view中rhtml可以用<%=@foo%>显示出来

4. 动作”的结果是提交不同的“模板”时,手工使用render方法

看看书上的介绍

def search
@results =Search.find(params[:query])
case @results
when 0 then render :action=> "no_results"
when 1 then render :action=> "show"
when 2..10 then render :action=> "show_many"
end
end

5. Render的方法可以提交不同的内容


* render(:text=>string) 直接render出文本
* render(:inline=>string,[:type=>"rhtml"|"rxml"])
把传入的string当成模板处理, 相当于rhtml的内容
* render(:action=>action_name) 直接调用某个action的模板,
相当于forward到一个view
* render(:file=>path;[:use_full_path=>true|false]) 使用某个模板文件
render, 当use_full_path打开时可以传入相对路径
* render(:template=>name) 使用模板名render ,
例子如下 render(:template => "blog/short_list")
# 自动使用/app/views/blog/short_list.rhtml(rxml)
* render(partial=>name) :partial
* render(:nothing=>true) 什么也不输出,包括layout
* render() 默认的的render, 相当于render(:action=>self)

而redirect 是引导重新定向

* redirect_to(:action=>'xxx') 使用语法和url_for一样(底层用url_for)
* redirect_to("/localpath")
* redirect_to("http://url")

1. partial

 

1.1 把partial作为view的一部分来渲染,可以调用render方法:

<%=render :partial=>"menu"%>

上面的代码会把文件名为_menu.html.erb的模板渲染到当前模板中。

<%= render :partial => "shared/menu" %>

渲染app/views/shared/_menu.html.erb到当前模板。

1.2 可以为partial单独指定layout:

<%= render :partial => "link_area", :layout => "graybar" %>

partial的layout文件名必须以下划线开头:_graybar.html.erb,而且必须把layout模板文件和partial放在同一个目录下。

 

2. 给partial传递局部变量


2.1 :locals选项用于设置partial的局部变量:

<%= render :partial => "form", :locals => { :button_label => "Create zone", :zone => @zone } %>

这样就可以在_form.html.erb中访问button_label和zone这两个变量。


2.2 每个partial都有一个和partial名字相同(不带下划线)的局部变量,可以通过:object选项给这个变量传递值:

<%= render :partial => "customer", :object => @new_customer %>

这样就可以在_customer.html.erb中访问customer这个变量,它指向@new_customer。
当然,作为父模板(parent)的一部分,partial可以直接访问父模板的实例变量,例如这里的@new_customer,但是如果这么做的话,partial就跟父模板耦合了,变得不容易重用了。所以建议使用partial的名字来引用实例变量而不是直接访问实例变量。
之前版本的Rails中,如果不指定:object或者:locals选项,rails会自动在父模板中寻找与partial同名的那个实例变量作为partial的局部变量,如:

<%= render :partial => "customer" %>

如果在_customer.html.erb中访问customer这个变量,rails将会自动在父模板中寻找名为@customer的实例变量。这个特性在Rails2.2中已经不建议使用了(deprecated)。Rails3.0中已经将这个特性移除了。


2.3 如果要传递给partial的实例变量名==partial名=model名,可以简写,如:

#当@customer为Customer这个model的实例,并且partial名为customer时

<%= render :partial => @customer %>

#相当于

<%= render :partial => "customer", :object=>@customer %>

 

3. 渲染集合(Collections)


3.1 :collection选项用于指定被传递给partial的集合对象

假设有books这么个集合,包含了5个Book对象,可以这样使用:

#main.html.erb

<%= render :partial => "book", :collection => books %>

#_book.html.erb

<p><%= book.name%></p>

 

这 样,在main.html.erb中,_book.html.erb的内容会被渲染5次。这时候,partial模板中,与partial同名的那个变量 指向了:collection选项传过来的集合中的每一项。如果你不想使用这个与partial同名的变量名,可以通过:as选项来设置你想要的变量名(:as的值只能用symbol,不能是string,否则在partial里会得到nil值):

<%= render :partial => "product", :collection => @products, :as => :item %>

3.2  下标索引值

在 设置:collection选项的时候,rails同时提供了一个counter变量给partial模板,变量名以partial名(不带下划线)开 头,以_counter结尾,并且经试验,这个变量名不受:as选项影响(也就是说在上面的代码中,这个变量名应该是product_counter而不 是item_counter)。其值为collection对象的索引值(从0开始)。

3.3 :spacer_template

:spacer_template选项用于指定填充于collection每个member之间的模板:

<%= render :partial => "product", :collection => @products, :spacer_template => "product_ruler" %>

上面的代码中,_product_ruler.html.erb的内容将被填充到每一对_product partial之间。
和:object一样,:collection也有简写形式: <%= render :partial => @products %>

分享到:
评论

相关推荐

    Ruby的render_partial技术详解

    整理后的在Ruby on rails的Haml有关render_partial的用法,本资源为一张图

    rails:Render的Rails 5入门项目

    本项目旨在提供一个基础的Rails 5.2应用模板,通过学习如何使用`render`方法,开发者可以更好地理解控制器和视图之间的交互。同时,了解部署Rails应用的基本流程也是成为合格Rails开发者的重要环节。通过实践这个...

    11. Render 部分partial与使用上的实例

    [Ruby_on_Rails][中文][Rails_5.x]__11._Render_部分partial與使用上的實例

    rails有用的命令

    - `render :partial =&gt; "cart_item", :collection =&gt; @cart.items`:在视图中渲染局部模板“cart_item”,遍历并显示@cart.items中的每一项。 13. **Rails新命令**: - `$ rails new my_project`:创建名为my_...

    jb:用于Ruby on Rails的简单快速的JSON API模板引擎

    带:collection选项的render_partial实际上会渲染集合(与Jbuilder不同) 句法 .jb模板应包含Ruby代码,该代码将返回任何to_json (通常为Hash或Array)的Ruby对象。 然后,返回值将to_json修改为JSON字符串。 例子 ...

    Rails 中页面中常用函数

    在Rails中,`.rhtml`文件是ERB(Embedded Ruby)模板,它允许开发者在HTML代码中嵌入Ruby代码。`list.rhtml`很可能是一个列表视图,用于显示数据库中的数据集合,例如用户列表、商品列表等。 以下是一些在Rails视图...

    r_mark:在 Rails 视图或部分渲染 Markdown

    马克 RMark 规定 Rails 应用程序在视图和部分中使用 Markdown。安装将此行添加到应用程序的 Gemfile 中: gem 'r_mark' 然后...= render 'pages/partial' %&gt; 在app/views/pages/_partial.md : # Partial- foo- bar- b

    stripe-rails:用于与Stripe集成的Rails引擎

    = render :partial =&gt; 'stripe/js' %&gt; 在这两种情况下,stripe-rails都会选择适合您的开发环境的stripe.js版本,并自动对其进行配置以使用您的可发布API密钥。 默认情况下,它在您的development环境中使用stripe-...

    液体导轨:渲染具有布局和部分支持的液体模板

    液体轨道 它允许您使用布局和部分支持来呈现.liquid模板。 它还提供了要在液体模板中使用的过滤器,标签,滴剂类。 安装 将此行添加到您的应用程序的Gemfile中:...# It will render app/views/home/_partial.liquid wh

    kumquat:Kumquat是用于渲染RMarkdown文件的Rails引擎

    例如,考虑对partial的典型render调用: render '_a_knitr_report' 这部分是_a_knitr_report.Rmd ,它是存储在您的应用中的常规RMarkdown文件: A Test Report for Kumquat ====================================...

    关于Ruby on Rails视图编写的一些建议

    下面将详细介绍一些关于Rails视图编写的建议。 #### 1. 不要直接从视图调用模型层 在视图中直接调用模型层的方法会使得视图变得臃肿且难以维护。正确的方式是通过控制器(Controller)来处理模型层逻辑,并将所需的...

    final-project

    在Rails中,`render`方法允许开发者将一个视图模板的输出嵌入到另一个模板中。这里,`:partial`选项指定了我们要渲染的部分视图的名字,而`'events/otherevents'`则说明该部分视图位于`app/views/events`目录下。...

    SitePoint-PublicActivity:SitePoint 上的 Activity Feeds with Rails 文章的源代码

    在主视图中,你可以通过`render :partial =&gt; 'activities', :collection =&gt; PublicActivity::Activity.all`来显示所有活动。 除了基本功能,PublicActivity还支持过滤、分页和自定义存储机制(如ActiveRecord、...

    contents_core:简单的结构以灵活的方式管理内容

    目录核心 一个Rails gem,它提供了一种以灵活的方式管理内容的结构:具有递归嵌套块的块+作为“叶”的项目 ... (可选)将块添加到视图中(例如页面显示): = render partial: 'contents_core/blocks', locals: { co

    Ajax 表单验证 实现代码

    - 通过render:partial返回部分视图信息,例如若登录名已存在则只返回验证结果。 - 假设其他平台(如Java平台的Servlet)也可以使用相似的方式返回数据。 4. 跨浏览器兼容性: 提到了表单验证实现代码兼容的...

Global site tag (gtag.js) - Google Analytics