rails视图层

来源:互联网 发布:淘宝学校哪家好 编辑:程序博客网 时间:2024/05/22 11:49

默认情况下,控制器中的方法会自动渲染和动作/方法名相同的视图

rails会自动去控制器对应的视图文件夹中寻找action_name.html.erb模板
def index
 xxxx
end
什么也不写就是渲染action_name.html.erb视图模板


render 'edit',会去当前控制器对应目录下寻找edit.html.erb进行渲染
也可以使用 render :edit
当然也可以是自定义的文件 render 'asdxxx',会去当前视图目录下寻找asdxxx.hjtml.erb文件并渲染


要渲染其他控制器的视图模板,
render 'other_controller_name/视图模板名称.html.erb'


默认情况下,rails渲染的是erb类型的模板,要指定其他模板的话只用,type: xxx
默认情况下,在控制器中第一次渲染的视图模板文件都是以渲染的名字开头的,而
在模板中渲染的其他视图模板,实际的文件名字是以 _(下划线)开头的
比如在index.html.erb中有 <% render 'edit' %>,那么是去当前目录下寻找
_edit.html.erb并渲染


render渲染文件
render '/path_name'  直接渲染文件,以斜杠开头,跟上文件路径
以斜杠开头表示渲染的是file类型,完整的表示是
render file: '/path_name'


此外还有
render plain: 'asasdadqw' 渲染纯粹的文本,不带任何html
render xml: {a: 1,b: 2,c: {d: 4}}将hash或者对象以xml格式渲染
render inline: '<% params.to_json%>'渲染erb格式的代码,erb中怎么写,这里就可以怎么写,但是不建议这样做,视图不应该放在控制器中
render html: '<h1>papapa</h1> 渲染html
render json: {a:1,b:2,c: {d: 3}}渲染hash或着其它json格式的对象/变量


render 的选项,在一般的render方法可以跟上选项,比如
render xxx,选项名: 选项值
几种选项:
content_type: 指定渲染得到的结果内容类型,默认情况下是application/html
可以指定为 content_type: 'application/rss'  'application/json'等
location:
可以设置http报头
status:
设置返回的状态码 比如: render text: 'sada',status: 404
下面是一些http状态码,rails是能够识别status的,比如
render text: 'asdsa',status 100
控制台的日志如下,rails识别了status 100表示continue


Started GET "/photos/preview" for 127.0.0.1 at 2017-07-02 19:02:22 +0800
Processing by PhotosController#preview as HTML
  Rendered photos/_edit.html.erb (0.3ms)
  Rendered photos/a.html.erb within layouts/application (4.0ms)
Completed 100 Continue in 351ms (Views: 339.2ms | ActiveRecord: 0.0ms)




响应类别 HTTP 状态码 符号
信息 100 :continue
101 :switching_protocols
102 :processing
成功 200 :ok
201 :created
202 :accepted
203 :non_authoritative_information
204 :no_content
205 :reset_content
206 :partial_content
207 :multi_status
208 :already_reported
226 :im_used
重定向 300 :multiple_choices
301 :moved_permanently
302 :found
303 :see_other
304 :not_modified
305 :use_proxy
306 :reserved
307 :temporary_redirect
308 :permanent_redirect
客户端错误 400 :bad_request
401 :unauthorized
402 :payment_required
403 :forbidden
404 :not_found
405 :method_not_allowed
406 :not_acceptable
407 :proxy_authentication_required
408 :request_timeout
409 :conflict
410 :gone
411 :length_required
412 :precondition_failed
413 :request_entity_too_large
414 :request_uri_too_long
415 :unsupported_media_type
416 :requested_range_not_satisfiable
417 :expectation_failed
422 :unprocessable_entity
423 :locked
424 :failed_dependency
426 :upgrade_required
428 :precondition_required
429 :too_many_requests
431 :request_header_fields_too_large
服务器错误 500 :internal_server_error
501 :not_implemented
502 :bad_gateway
503 :service_unavailable
504 :gateway_timeout
505 :http_version_not_supported
506 :variant_also_negotiates
507 :insufficient_storage
508 :loop_detected
510 :not_extended
511 :network_authentication_required


layout选项
这个也是用的最多的一个,默认情况下,但凡是渲染视图文件,都会默认使用与控制器同名的布局(layout),如果没有就使用application.html.erb这个布局文件
但是必须是渲染视图文件,前面所说的text plain xml json nothing 这些都不算是视图文件,即便是html inline也不算是视图,必须得是
render 'a' 
render '/admin/b'
像这样的具体到某个以 erb为结尾的视图文件才算是渲染视图文件哦!
可以指定使用其他的布局文件,布局文件都是在layout中寻找,即便前面加/也不会去其他目录寻找
render 'a',layout: 'b' 会在layout目录下寻找b.html.erb布局视图
在控制器中可以指定该控制器所有动作统一使用布局文件
class XxxController < ApplicationController
layout: 'xxx'
end
要想整个程序所有控制器的渲染结果都使用某一布局,在application_controller中指定即可
要想视图不使用布局,加上layout: false即可
render 'a',layout: false


一个方法中只能渲染一次
render 'a'
render 'b'
这样会报错


redirect_to方法
render只是决定控制器在响应的时候,使用哪个视图返回,而redirect_to是告诉浏览器重新发起一次请求




布局文件views/layout/
默认情况下,rails会自动在每个动作/方法对应的视图文件之前加载与方法名对应的
布局文件,在layout目录下查找,如果没有定义则使用application.html.erb布局


布局中几个常用的方法:
javascript_include_tag
默认情况下,直接使用 '文件名',即可将该js文件包含在程序中每个视图中
也可以使用 /开头的从程序根目录/项目根目录开始的路径引用其他文件
<%= stylesheet_link_tag "main" %>引用app/assets/javascripts中的main.js




stylesheet_link_tag用法同javascript_include_tag
<%= stylesheet_link_tag "main_print", media: "print" %>
引用的css文件会包含在每个视图文件中


yield方法
<% yield %>这个方法会直接将整个视图文件插入至这个位置
比如 render 'a',那么就会用a.html.erb视图模板替代在布局中 <% yield %>的位置
<% yield :符号名%> 给yield提供一个参数,这个参数来自于视图中的provide方法
<% provide :符号名,值 %> ,会将这个值替换至布局中yield的位置

但是这样有个不好的地方,yield没有名字,也就是说在布局中任何地方,一旦有
yield 方法调用的地方(不带参数)就会插入一次渲染的视图
即,若布局中写了三行yield,那么渲染视图的时候,就会从上至下出现3次重复的视图
<%= yield %>
<%= yield %>
<%= yield %>
或者说,我们无法指定我们具体希望渲染的视图中哪部分被插入到页面,从而显示在页面中,yield会将整个视图插入。


所以可以通过content_for来实现
在视图中将要包含的代码用
<%content_for :符号名 do %>
<% end%>
包起来,然后在布局中调用 <%= yield :符号名 %>
这样就可以将用content_for包起来的代码插入进来了。


局部视图
局部视图的用法和普通视图一样,为的是将更加具体的页面单独分开,下次需要用的时候render一下就可以了,但是在视图中渲染局部视图对应的文件名前面都有个下划线,如 render 'a',若是在视图中进行渲染的话,那么对应的视图模板文件就是 
_a.html.erb


同样,布局也一样,当我们在视图中渲染视图的时候,也可以指定使用其他的布局,
render partial: 'a',layout: 'ad_banner'
layout选项指定的局部布局,对应的文件名也是以下划线开头,不过这里的布局文件与引用的视图文件需要存在同一个地方,而不再是layout目录下,另外如果render视图的时候如果需要指定其他选项(比如布局)的话,就必须写明partial选项,而不能再直接写文件名.


传递本地变量
同样,还是 默认情况 下。。。(rails的多约定,少配置,我不知不觉已经习惯了)
每个视图默认会将方法中的实例变量传进来,比如我在index方法中有实例变量
@users @posts 等等,那么在index.html.erb 中rails 是默认是将这些变量传进来的,但是有些情况,我们会需要引用一些其他的变量给局部视图使用
可以使用 locals选项,如
render partial: 'a',locals: {变量名: 值} 
视图名'a'前面要使用partial选项指定,因为render中一旦有其他选项的存在就必须显示的指定partial选项


另外局部会默认携带一个和局部视图同名的变量,不过一般用的比较少(我没用过),一般都是直接使用方法中生成的实例变量


渲染集合
当希望视图中列出一个对象数组的时候,可以直接传递对象集合给局部视图
render partial: 'a',collection: @users
在这里渲染的是名称为a的局部视图,那么渲染的时候,a视图中有个变量a可以使用,
这个变量代表的是@users中的一个变量,整个render方法的结果就是,将视图对每个变量都渲染一次。
渲染集合还有个简写的形式:
render @users
直接将实例集合的实例变量作为参数给render,这样的话,rails会按照每个实例对象的模型名去渲染对应局部视图,比如这里如果是User模型的话,那么rails就会渲染_user.html.erb这个视图,然后在_user.html.erb视图中,就可以使用user变量直接访问集合中单个实例对象了,比如,_user.html.erb中内容大概是这样


<%= user.name%>&nbsp;
<%= user.age%><br>
这样最后的结果就是遍历整个实例集合,将每个user的name和age输出在视图,并且一个user输出结束就换一行

原创粉丝点击