ajax in rails and rjs

rails and ajax

render:update do |page|
page.replace_html 'user_list', :paitial => 'user', :collection => @users
page.visual_effect :highlight, 'user_list'
end


render:update 生成了一个javascript generator,也就是上面的page, 这个generator提供了很多方法,可以用来完成很多功能的javascript生成,通过调用这个generator的方法,render:update 会返回生成的javascript代码,并将返回内容的MIME类型设置成text/Javascript, 这样客户端的AJAX请求就可以识别并执行返回的javascript代码,完成各种动态的效果。

通过这个Generator, 开发人员可以不用接触javascript就可以实现大部分常用功能。例如,通过[](id)方法,我们可以在DOM中找到元素id等于id的对象,并对个该对象进行操作:
page['blank_slate']
page['blank_slate'].show
page['blank_slate'].show('first').up

生成的javascript代码就是:
$(blank_slate')
$(blank_slate').show
$(blank_slate').show('first').up


更强大的地方在于page的select方法,它能够使用css selector语法来选择页面上的元素,对它进行操作:
page.select('div.to_be_hidden').each {|element| element.hide}
除此之外,generator还提供了众多的方法来帮助用户生成各种特效, 例如:
page.replace_html 'blank', 'Hello, world!' # 替换blank的内容为hello world。
page['foo'].value = 'new value' #将foo元素的值设置为new value
page.hide 'message' # 隐藏message元素

generator也提供了一些直接操作javascript的方法:
page << "alert('hello')" #直接插入alert('hello')代码
page.assign 'foo', 'value' #给javascript变量foo赋值为value
page.call 'func' #调用javascript函数func


RJS模板:

render:update 已经给我们动态生成javascript提供了很大的便利,然而它只能用在controller中,这在需要生成大量javascript代码的时候,controller会变得很臃肿,同时不便于管理和重用。RJS为我们提供了另一个好的选择。
RJS模板和RHTML以及RXML模板类似,都是在controller执行完毕后被render然后发送到客户端,其不同之处在于RJS最后被render成为javascript代码发送到客户端然后被执行,执行的结果往往被用来改变原有的页面内容,不像RHTML模板,会被用来生成新的内容页面。RJS模板通常在客户端的请求是ajax的类型的时候才会被调用,也就是说,如果一个action有两个模板,index.rhtml 和 index.rjs, 则如果以非ajax的方式调用index, 则rhtml模板将会被启用,rjs模板会被忽略;相反,如果是ajax方式调用,rjs模板将会被启用。

RJS模板的内容就是前面例子中传递给render:update的block中的内容,rails会自动生成一个javascript generator给rjs模板使用。例如:
page.replace_html 'user_list', :paitial => 'user', :collection => @users
page.visual_effect :highlight, 'user_list'
RJS模板和render:update给我们带来了很大的便利,然而相比rhtml模板,rjs模板也有美中不足,例如不支持partial,这使得重构和复用模板变得不那么容易了。


还有一种方法可以帮助我们有效的组织我们的javascript代码,这就是rails的helper,我们可以将render:update的block中的内容放到helper中,这为我们复用和重构提供了一个有效的工具。 例如:

module ApplicationHelper

def update_time
page.alert 'hello'
end

def spike
render(:update){|page| page.alert_hello}
end
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值