rails敏捷开发《5》

上传人:桔**** 文档编号:549146970 上传时间:2023-04-16 格式:DOC 页数:77 大小:1.12MB
返回 下载 相关 举报
rails敏捷开发《5》_第1页
第1页 / 共77页
rails敏捷开发《5》_第2页
第2页 / 共77页
rails敏捷开发《5》_第3页
第3页 / 共77页
rails敏捷开发《5》_第4页
第4页 / 共77页
rails敏捷开发《5》_第5页
第5页 / 共77页
点击查看更多>>
资源描述

《rails敏捷开发《5》》由会员分享,可在线阅读,更多相关《rails敏捷开发《5》(77页珍藏版)》请在金锄头文库上搜索。

1、第22章ActionController和RailsAction Controller and Rails 在前一章里,我们己经看到ActionController如何将用户提交的请求路由到应用程序中适当的代码。现在我们来看看代码内部发生了什么。22.1 Action方法Action Methods当控制器对象处理请求时,它会查找与“被请求的action”同名的public实例方法。如果找到,即调用此方法;如果找不到,但控制器实现了method_missing(),则调用后者,并传入action名称作为第一个(也是唯一的)参数。如果没有任何方法可以调用,控制器就寻找名称匹配的视图模板;如果找到

2、,就直接渲染该模板。如果以上所有条件都不符合,控制器就会报告“Unknown Action”的错误。默认情况下,控制器中任何public的方法都可以作为action方法被调用。如果你希望某些方法不被作为action调用,可以将其声明为protected或者private。如果出于某些原因必须把某个方法声明为public,但又不想让它作为action被调用,也可以使用hide_action()方法将它藏起来。class OrderController ApplicationController def create_order order = Order.new(params:order) if

3、 check_credit(order) order.save else # . end end hide_action :check_credit def check_credit(order) # . endend如果你因为想要在多个控制器之间共享某些方法而使用hide_action()方法,请考虑将这些方法放到单独的库中你的控制器可能包含太多应用逻辑了。控制器环境Controller Environment控制器为action(以及它们所调用的视图)设置了一个环境。很多方法可以直接获取URL或请求中的信息。action_name当前进行处理的action名称。cookies与请求相关的c

4、ookie。当应答被送回浏览器时,这个对象中设置的值就会作为cookie保存到客户机。在第434页我们还会详细讨论cookie的问题。headers一个类似于hash的对象,代表HTTP头信息,该信息将被用于应答。默认状态下,Cache-Control值被设置为no_cache。在某些特殊的应用中,你可能需要设置Content-Type的值。请注意,不要在头信息中直接设置cookie,而应该用cookie API来设置。params一个类似于hash的对象,其中存放着请求参数(以及路由生成的伪参数)。之所以说它“类似于hash”,因为你可以用符号或者字符串来查找其中的内容params:id和p

5、aramsid会返回同样的值。(习惯上采用符号来获取参数值。)request进入控制器的请求对象,其中有用的属性包括:l request_method,返回客户端访问所使用的请求方法,可能的值包括:delete、:get、:head、:post和:put。l method返回值除了:head外,和request_method是相同的,而:head的返回值和:get相同,因为从应用角度来看,两种实现的功能是一样的。l delete?、get?、head?、post?和put?,根据当前请求所使用的方法返回true或false。l xml_http_request?和xhr?,如果请求来自Ajax

6、辅助方法,则返回true。这个属性与method属性值无关。l url返回请求的完整URL。l protocol,host,port,path,和 query_string分别返回与URL中的相应部分,其匹配模式是:protocol:/host:port/path?query_string。l domain,返回请求地址中域名部分的最后两段。l host_with_port,返回请求对应的host:port格式的字符串。l port_string,如果端口号不是默认端口,返回:port格式的字符串。 l ssl?, 如果使用SSL请求,则返回值为true;也就是说,请求使用的是HTTPS协议。

7、l remote_ip,以字符串的形式返回客户端的IP地址。如果客户端位于代理服务器之后,该字符串中可能包含多个IP地址。l path_without_extension path_without_format_and_extension, format_and_extension和relative_path返回路径的对应部分。l env,请求的环境。你可以通过这个属性访问到浏览器设置的环境变量值,例如:request.envHTTP_ACCEPT_LANGUAGE l accepts,请求中accepts的MIME类型。l format,请求中accepts的MIME类型。如果没有指定格式,

8、则会使用第一个可用类型。l mime_type,与扩展名相关的MIME类型。l content_type,请求的MIME类型。对put和post请求有用。l headers,完整的HTTP头。l body, 请求的实体部分,是一个I/O流。l content_length,实体的长度。class BlogController show end render :template = fix_user_errorsend看起来很自然:调用render(或者redirect to)就应该终止action的处理。但事实并非如此。如果update_attributes的返回值为true,这段代码就会导致

9、一个错误,因为render被调用了两次。我们来看看如何在控制器中使用不同的渲染选项(在第509页会单独介绍如何在视图中进行渲染)。render()在没有任何参数的情况下,render()方法会渲染当前action的默认模板。譬如说,下列代码会渲染app/views/blog/index.html.erb模板。class BlogController ApplicationController def index render endend下列代码的效果也是一样(如果没有显式调用render()方法,在action方法执行结束后控制器也会自动调用它)。class BlogController ApplicationController def index endend下列代码的效果也一样(如果没有定义合适的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号