- 浏览: 2683558 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
80后的童年2:
深入浅出MongoDB应用实战开发网盘地址:https://p ...
MongoDB入门教程 -
shliujing:
楼主在不是精通java和php的前提下,请不要妄下结论。
PHP、CakePHP哪凉快哪呆着去 -
安静听歌:
希望可以一给一点点注释
MySQL存储过程之代码块、条件控制、迭代 -
qq287767957:
PHP是全宇宙最强的语言!
PHP、CakePHP哪凉快哪呆着去 -
rryymmoK:
深入浅出MongoDB应用实战开发百度网盘下载:链接:http ...
MongoDB入门教程
Rails的Ajax是依赖于prototype库的,我们来看看ActionView对prototype的一些方法调用的封装
源文件为prototype_helper.rb,其中包括RJS的update_page调用的JavaScriptGenerator类的定义:
1,link_to_remote是简单的异步url请求
link_to_remote调用remote_function组织Prototype方法调用,然后调用link_to_function生成html标签和绑定onclick事件
看看例子:
其中:update参数用来在Ajax异步调用完成后更新页面DOM元素,通常controller返回的结果为一个partial
2,periodically_call_remote用来做周期性url请求
它new一个PeriodicalExecuter对象来完成周期性的工作,而callbacks等参数和link_to_remote一样,其中:frequency默认是10秒,看看例子:
3,observe_form和observe_field用来监听form和field,如果内容改变,则触发function调用
build_observer方法给出了生成JavaScript的实现(这段代码看着有点reflection的意思),然后使用javascript_tag来将JavaScript写入模板
看看例子:
4,JavaScriptGenerator
我们终于看到了update_page这个helper方法了,它初始化JavaScriptGenerator对象,然后调用to_s方法返回生成的JavaScript代码
而update_page后的block中page方法返回self,即返回JavaScriptGenerator对象
JavaScriptGenerator类中定义了select,replace,hide,delay,visual_effect等我们熟悉的helper方法
而其中visual_effect,sortable,draggable和drop_receiving实际上会调用scriptaculous_helper中相应的方法
看看RJS的例子:
而[]方法和select方法分别使用JavaScriptElementProxy和JavaScriptElementCollectionProxy代理类
如果大家想了解和熟悉RJS语法,多看看javascript_helper.rb,prototype_helper.rb,scriptaculous_helper.rb
源文件为prototype_helper.rb,其中包括RJS的update_page调用的JavaScriptGenerator类的定义:
1,link_to_remote是简单的异步url请求
def link_to_remote(name, options = {}, html_options = {}) link_to_function(name, remote_function(options), html_options) end def remote_function(options) javascript_options = options_for_ajax(options) update = '' if options[:update] && options[:update].is_a?(Hash) update = [] update << "success:'#{options[:update][:success]}'" if options[:update][:success] update << "failure:'#{options[:update][:failure]}'" if options[:update][:failure] update = '{' + update.join(',') + '}' elsif options[:update] update << "'#{options[:update]}'" end function = update.empty? ? "new Ajax.Request(" : "new Ajax.Updater(#{update}, " url_options = options[:url] url_options = url_options.merge(:escape => false) if url_options.is_a?(Hash) function << "'#{url_for(url_options)}'" function << ", #{javascript_options})" function = "#{options[:before]}; #{function}" if options[:before] function = "#{function}; #{options[:after]}" if options[:after] function = "if (#{options[:condition]}) { #{function}; }" if options[:condition] function = "if (confirm('#{escape_javascript(options[:confirm])}')) { #{function}; }" if options[:confirm] return function end
link_to_remote调用remote_function组织Prototype方法调用,然后调用link_to_function生成html标签和绑定onclick事件
看看例子:
<%= link_to_remote "Delete this post", :update => "posts", :url => { :action => "destroy", :id => post.id } %> <%= link_to_remote "Undo", :url => { :action => "undo", :n => word_counter }, :complete => "undoRequestCompleted(request)" %>
其中:update参数用来在Ajax异步调用完成后更新页面DOM元素,通常controller返回的结果为一个partial
2,periodically_call_remote用来做周期性url请求
def periodically_call_remote(options = {}) frequency = options[:frequency] || 10 code = "new PeriodicalExecuter(function() {#{remote_function(options)}}, #{frequency})" javascript_tag(code) end
它new一个PeriodicalExecuter对象来完成周期性的工作,而callbacks等参数和link_to_remote一样,其中:frequency默认是10秒,看看例子:
<%= periodically_call_remote :update => 'time_div', :url => {:action => "time"}, :frequency => 1.0 %>
3,observe_form和observe_field用来监听form和field,如果内容改变,则触发function调用
def observe_form(form_id, options = {}) if options[:frequency] build_observer('Form.Observer', form_id, options) else build_observer('Form.EventObserver', form_id, options) end end def observe_field(field_id, options = {}) if options[:frequency] && options[:frequency] > 0 build_observer('Form.Element.Observer', field_id, options) else build_observer('Form.Element.EventObserver', field_id, options) end end protected def build_observer(klass, name, options = {}) if options[:with] && !options[:with].include?("=") options[:with] = "'#{options[:with]}=' + value" else options[:with] ||= 'value' if options[:update] end callback = options[:function] || remote_function(options) javascript = "new #{klass}('#{name}', " javascript << "#{options[:frequency]}, " if options[:frequency] javascript << "function(element, value) {" javascript << "#{callback}}" javascript << ", '#{options[: on]}'" if options[: on] javascript << ")" javascript_tag(javascript) end
build_observer方法给出了生成JavaScript的实现(这段代码看着有点reflection的意思),然后使用javascript_tag来将JavaScript写入模板
看看例子:
<%= observe_form "entry-form", :frequency => 1, :update => "live-preview", :complete => "Element.show('live-preview')", :url => {:action => "preview"} %> <%= observe_field 'search', :frequency => 0.5, :update => 'target_id', :url => { :controller => '<controller>', :action=> 'list' }, :with => "'search=' + escape(value)" %>
4,JavaScriptGenerator
def update_page(&block) JavaScriptGenerator.new(@template, &block).to_s end class JavaScriptGenerator def initialize(context, &block) #:nodoc: @context, @lines = context, [] include_helpers_from_context @context.instance_exec(self, &block) end private def include_helpers_from_context @context.extended_by.each do |mod| extend mod unless mod.name =~ /^ActionView::Helpers/ end extend GeneratorMethods end module GeneratorMethods def to_s returning javascript = @lines * $/ do if ActionView::Base.debug_rjs source = javascript.dup javascript.replace "try {\n#{source}\n} catch (e) " javascript << "{ alert('RJS error:\\n\\n' + e.toString()); alert('#{source.gsub('\\','\0\0').gsub(/\r\n|\n|\r/, "\\n").gsub(/["']/) { |m| "\\#{m}" }}'); throw e }" end end end def [](id) JavaScriptElementProxy.new(self, id) end def select(pattern) JavaScriptElementCollectionProxy.new(self, pattern) end def insert_html(position, id, *options_for_render) insertion = position.to_s.camelize call "new Insertion.#{insertion}", id, render(*options_for_render) end def replace_html(id, *options_for_render) call 'Element.update', id, render(*options_for_render) end def replace(id, *options_for_render) call 'Element.replace', id, render(*options_for_render) end def remove(*ids) loop_on_multiple_args 'Element.remove', ids end def show(*ids) loop_on_multiple_args 'Element.show', ids end def hide(*ids) loop_on_multiple_args 'Element.hide', ids end def toggle(*ids) loop_on_multiple_args 'Element.toggle', ids end def alert(message) call 'alert', message end def redirect_to(location) assign 'window.location.href', @context.url_for(location) end def call(function, *arguments, &block) record "#{function}(#{arguments_for_call(arguments, block)})" end def delay(seconds = 1) record "setTimeout(function() {\n\n" yield record "}, #{(seconds * 1000).to_i})" end def visual_effect(name, id = nil, options = {}) record @context.send(:visual_effect, name, id, options) end def sortable(id, options = {}) record @context.send(:sortable_element_js, id, options) end def draggable(id, options = {}) record @context.send(:draggable_element_js, id, options) end def drop_receiving(id, options = {}) record @context.send(:drop_receiving_element_js, id, options) end def call(function, *arguments, &block) record "#{function}(#{arguments_for_call(arguments, block)})" end private def page self end def record(line) returning line = "#{line.to_s.chomp.gsub(/\;\z/, '')};" do self << line end end def method_missing(method, *arguments) JavaScriptProxy.new(self, method.to_s.camelize) end end end
我们终于看到了update_page这个helper方法了,它初始化JavaScriptGenerator对象,然后调用to_s方法返回生成的JavaScript代码
而update_page后的block中page方法返回self,即返回JavaScriptGenerator对象
JavaScriptGenerator类中定义了select,replace,hide,delay,visual_effect等我们熟悉的helper方法
而其中visual_effect,sortable,draggable和drop_receiving实际上会调用scriptaculous_helper中相应的方法
看看RJS的例子:
update_page do |page| page.insert_html :bottom, 'list', "<li>#{@item.name}</li>" page.visual_effect :highlight, 'list' page.hide 'status-indicator', 'cancel-link' end
而[]方法和select方法分别使用JavaScriptElementProxy和JavaScriptElementCollectionProxy代理类
如果大家想了解和熟悉RJS语法,多看看javascript_helper.rb,prototype_helper.rb,scriptaculous_helper.rb
发表评论
-
用了TextMate才知道什么叫神级Editor
2011-03-09 04:51 58001一直用Eclipse作为开发Ruby和Java项目的IDE,但 ... -
Ruby使用OAuth登录新浪微博和豆瓣
2011-01-09 12:49 4469首先需要安装oauth这个gem包 gem install ... -
使用Passenger+nginx部署Rails
2010-12-28 15:12 50341. Install Passender gem instal ... -
markItUp+rdiscount搭建Rails下可视化Markdown编辑器
2010-12-21 17:48 5475markItUp是基于jQuery的可视化编辑器,支持Html ... -
Rails3 and MongoDB Quick Guide
2010-12-10 14:13 2761Install MongoDB Download: http: ... -
基于ruby-protobuf的rpc示例
2009-08-11 11:51 41531, 安装ruby-protobuf gem instal ... -
Ruby导出xls和csv的utf-8问题的解决
2009-02-04 15:05 6864数据库数据为utf-8格式,包括中文和拉丁文等等 导出文件xl ... -
URL/HTML/JavaScript的encode/escape
2009-01-04 13:03 9349最近经常被URL、HTML、JavaScript的encode ... -
各种排序的Ruby实现
2008-11-27 14:51 4009Θ(n^2) 1, Bubble sort def bu ... -
12月5日北京RoR活动!
2008-11-26 18:38 3025又是一年过去了,Rails在国内的发展势态良好,很多使用RoR ... -
Rails程序开发的最大问题是代码规范
2008-08-28 11:56 5589使用Rails开发大型复杂B2B应用一年了,这个项目目前开发人 ... -
Web开发大全:ROR版——推荐序
2008-07-09 00:39 2432来自http://www.beyondrails.com/bl ... -
深入ActionMailer,使用Sendmail发邮件
2008-07-03 11:41 3401来自: http://www.beyondrails.com/ ... -
Rails里如何结合ExceptionNotification配置gmail账户发邮件
2008-06-19 19:56 31061,安装ExceptionNotification rub ... -
使用coderay和railscasts样式进行代码高亮
2008-06-17 00:16 2401CodeRay是一个语法高亮的Ruby库,效率很不错。 Cod ... -
Capistrano试用
2008-06-16 19:05 19641,客户端机器安装Capistrano gem insta ... -
lighttpd真垃圾啊
2008-06-04 18:38 2550使用lighttpd+fcgi跑Rails程序,文件上传会si ... -
将gem变成plugin
2008-06-04 11:27 1810有什么样的需求就有什么样的对策 当vhost上的帐号没有ge ... -
在Rails里使用ReCaptcha添加验证码
2008-06-03 15:51 42751,去http://recaptcha.net/sign up ... -
Rails里给文件上传添加progress_bar
2008-05-27 17:00 2100文件上传很慢时,UI没有什么用户提示,这样让人很费解,所以我们 ...
相关推荐
持续移动且不破坏事物 :factory: :building_construction: :construction: :construction_worker: 正在建设中-请稍后再回来!
Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails 应用程序要快。 Rails::API 可以用来创建只提供API服务(API-Only)的 Rails ...
map_helper 在您的Rails应用程序或其他应用程序中实现Google Maps的简便方法。 ### 依赖关系:jQuery ## Load将map_helper放置在供应商文件夹中。 小贩 JavaScripts map_helper maphelper.coffee /app/assets/...
:dog_face: MiAudota :cat_face: 该应用程序显示可从用户最近的庇护所获取的动物,并允许将其应用到收养过程中,从而完成一份调查表,... Ruby on Rails API; PostgreSQL; Heroku。执照版权所有:copyright:2019, 。
世界风java源码100DaysofCode_R1Log 登录以记录我前 100 天的代码挑战。 总之 可以公平地说,我在这 100 天里取得的大部分成就都是通过承诺挑战和投入工作而实现的,尽我所能在工作和孩子的承诺之间做出贡献。 #100...
Rails管理员状态机 主存储库已移至gitlab,所有新代码将在其中: 从rails_admin正确管理状态 允许从Rails Admin轻松地将state_machine事件发送到模型,包括对ActiveRecord \ Mongoid和自定义状态字段名称的支持以及...
这个 gem 在rails_helper.js.coffee.erb.上的编译时间上嵌入了image_path 、 asset_path和路由表rails_helper.js.coffee.erb. RailsHelper有一些功能。 局限性 这个 gem 只能使用没有命名路由的段。 前任。 # ...
允许您使用为Rails应用程序的前端供电。 是将前端工具像Ruby一样进行编程,纯属喜悦! :smiling_face_with_heart-eyes: 或在运行的检查。 产品特点 :high_voltage: :light_bulb: 即时服务器启动 :high_voltage: ...
《local_time_helper.cr:水晶语言实现的本地时间视图助手》 在软件开发中,特别是Web应用程序,我们经常需要在用户界面中展示当前用户所在时区的时间。这涉及到时区转换和本地化处理,以便为用户提供更加友好和...
SEO 和 Ruby On Rails 由的SEO代理制作的示例应用程序,用于将Rails设置为SEO友好。教程您可以在找到教程,或在。安装 git clone git@github....
安装将 spree_cloudzoom 添加到您的 Gemfile 中: gem 'spree_cloudzoom' 捆绑您的依赖项并运行安装生成器: bundlebundle exec rails g spree_cloudzoom:install测试请务必捆绑您的依赖项,然后为要运行的规范创建...
介绍插件,用于对记录进行排序(使用 gem)安装要启用rails_admin_acts_as_list,请将以下内容添加到您的Gemfile : gem 'rails_admin_acts_as_list'gem 'rails_admin' 重要提示: rails_admin_acts_as_list之前必须...
gem 'foundation_rails_helper' , '~> 3.0' 然后执行: $ bundle 兼容性 仅完全支持Rails 4.1 / 4.2 / 5/6和Foundation 6 某些功能可能适用于Foundation 5及更早版本,但结果可能会有所不同,并且
word分词器java源码 IMAX.im 功能 依附于 Douban API 创建电影信息库; 上传资源的时候自动解析 Ed2k, Torrent 的信息; 国内在线视频网站播放地址解析; Retina Display 支持; Apple TV API for @盒子大师 系统需求...
Rails的服务器定时响应头 带来Ruby on Rails服务器端性能指标 :chart_increasing: 通过server_timing gem访问Chrome的开发者工具(以及其他支持浏览器)。 生产安全:trade_mark:。 指标是从 gem收集的。 不需要帐户...
参见安装将solidus_geocoding添加到您的Gemfile中: gem 'solidus_geocoding' 捆绑您的依赖项并运行安装生成器: bundlebundle exec rails g solidus_geocoding:install测验首先捆绑您的依赖项,然后运行rake 。...
对Rails的扩展,以允许使用绕道而行,返回简单的工作流浏览器导航。 特征 将您的“ link_to”行切换为“ detour_to”,并将您的控制器“ redirect_to”切换为“ back_or_redirect_to”,以允许用户从其来访者返回。 ...
Textile Editor Helper是Ruby on Rails的插件,可在textareas上方添加Textile工具栏。 此版本的Textile Editor Helper是在上找到的代码的分支,以允许与form_for方法一起使用。 依存关系 要使用Textile Editor ...
Rails Admin内容生成器 使用创建内容的简单方法。 预习 示范 要求 依存关系 MiniMagick 支持的ORM ActiveRecord 支持的资产插件 CarrierWave 安装 使用rails <5和TurboLink <5进行测试 将此行添加到您的...
Ruby on Rails,简称Rails,是基于Ruby语言的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发更高效、更简洁。本资源"For-Rails-Beginners"显然是为那些希望入门Ruby on Rails的初学者...