Rails中跨域请求的解析

如何进行跨域资源请求

可以通过以下两种方式进行跨域资源请求:

  • JSONP
  • CORS(cross-origin resource sharing: 跨来源资源共享)

什么是JSONP

关于JSONP,以下是来自维基百科的介绍:

JSONP(JSON with Padding)是资料格式 JSON 的一种“使用模式”,可以让网页从别的网域要资料。另一个解决这个问题的新方法是跨来源资源共享。

由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com 的服务器沟通,而 HTML 的 <script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的 JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。

所有支持Javascript的浏览器都支持[同源策略] (http://zh.wikipedia.org/wiki/%E5%90%8C%E6%BA%90%E7%AD%96%E7%95%A5) (来自维基百科),而html中的img,script等标签是不用遵循同源策略的。JSONP相当与利用了script的这个特点,去加载不同origin的资源。

JSONP的原理,简单来说就是加载不同origin的脚本,然后执行。一般来说,一些资源都是一些数据,比如JSON格式,而script加载的是js文件并执行,那么要求返回的是一个可执行的js文件,而服务器端只提供数据,并不知道客户端要如何处理这个数据。所以一般客户端可以写一个回调函数,然后把回调函数的名字告诉服务器端,而服务器端会将json数据作为参数,包含上回调函数的名字,然后将wrapper后的内容作为js文件返回。

具体流程可以参照下图:

jsonp处理流程图

Read more...

我在调查jpmobile过程中的总结

概述

JPMobile(Github),是一个rails的gem包,主要是用来简化针对日本不同的手机客户端view层的设计。
Ripple是一个chrome的plugin,可以模拟很多手机的浏览器。

关于ruby的一些小知识

  • Module.autoload is a instance_method
  • Kernel.autoload is not a instance_method
  • module_function : 定义模块方法
  • :: 引用顶级命名空间,例子 ::File
  • /^(?:abcde)/ 其中?:的意思是:只匹配exp,不捕获匹配的文本,也不给此分组分配组号。

有用的链接

如何在vim中进行ruby,rails的debug(针对ruby>=1.9 && use debugger-xml gem)

概要说明

关于具体的构筑手顺,参照vim-ruby-debugger中的Readme内容即可。 这里主要是写一些自己在构筑构成中碰到一些问题和注意事项。

环境

CentOS 6.2
ruby 1.9.3p125 (2012-02-16 revision 34643)

参考文章

事前准备

确认CentOS中是否有以下package。

  • libXt
  • libXt-devel
  • glib
  • gtk2
  • gtk2-devel

特别注意:

  1. 关于glib,gtk2,gtk2-devel,在vim源代码目录的src/INSTALL文件中有说明,如果要打开clientserver开关的话,需要安装这些package。
  2. 一定要确认X11环境是否已经具备,特别是libXt-devel package。我构筑的时候就是没有这个环境,然后花费了很多时间。
Read more...

(专题)如何在vim中进行ruby,rails的debug调试

前言

本次主题是如何在vim中进行rails程序的debug调试。

Vim准备

  • 使用插件:vim-ruby-debugger
    该插件需要vim7以上版本,并且编译时开启了clientserver,signs功能。
  • 如何确认?
    在vim中运行version命令,查看结果中是否开启这两个功能。
  • 如何在编译时开启client-server功能。
    由于client-server需要使用GUI的一些组件,所以必须开启GUI。而开启GUI,在Linux中需要依赖一些X11的东西。我的做法是:
Read more...

我常使用的rails gem包

前言

这里主要是记述自己经常使用的一些gems,或者是偶尔看到的一些gems。

Gems

一个问卷调查的gem,可以通过DSL建立问卷
surveyor(github)

认证的gem
devise(github)

权限控制的gem
cancan(github)

表单gem,view层的东西
formtastic(github)

一个后台任务执行引擎
backgroundrb(rubyforge)
backgroundrb(github)

以下这个是对backgroundrb在rails3下面的支持
backgroundrb-rails3(github)

SSL控制的gem bartt-ssl_requirement

Rails Projects

Teambox:协作平台 Teambox(github)

rails的博客系统RefineryCMS RefineryCMS(github)

关于Rails中的SSL

关于force SSL请求的配置

只需要在config文件(比如application.rb)中添加如下配置:
config.force_ssl = true

关于如何启动支持SSL的server,可以使用thin服务器。具体做法如下:

  • 在Gemfile中添加如下内容:
group :development do
  gem 'thin'
end
  • 启动ssl服务器的命令: thin start --ssl

如果部分请求force ssl, 部分请求还是http的情况

  • 在配置文件中做如下配置
config.middleware.insert_before ActionDispatch::Static, Rack::SSL, :exclude => proc { |env| env['HTTPS'] != 'on' }

# 注1:可能需要在头部 require 'rack/ssl'
# 注2:exclude就是针对那些请求不会包装成https的请求。比如上面的配置意思就是说,  
#     如果客户请求的是http(比如在地址栏输入的是http://localhost),那么就去请求http
  • 在需要强制https的controller中添加 before_filter, 例如:
before_filter :force_ssl

def force_ssl
  if !request.ssl?
	redirect_to :protocol => 'https', :port => 3001
  end
end
  • 这个时候测试的话可能需要启动两个服务器
thin start -p 3000  
thin start --ssl -p 3001  

linux下网络设置

Ubuntu系统

  • 网络配置文件路径: /etc/network/interfaces
  • 路由设置配置文件路径: /etc/resolv.conf
    注意有时候经常设置固定ip后上不了网,这个时候可能是因为dns配置没有修改过来。

CentOS系统

  • 网络配置文件路径: /etc/sysconfig/network-scripts/ifcfg-eth0
  • 路由设置配置文件路径: /etc/resolv.conf , 这个文件手动改不管用,会自动改回去,可以在上面的配置中加入DNS的配置,重启网络就可以自动重新配置这个文件。

特别注意

如果要在windows端手动的修改vmnet8的ip地址等,那么修改之后如果还需要让虚拟机访问外网,那么需要针对能够上外网的网卡进行共享配置。 比如现在是local network有限上网,那么就需要在本地网络的属性中有[共有]那个tab里面要把本地网络共享给vmnet8,这样的话,才可以在 虚拟机里面上外网。

rails中helper的加载和相关设置,以及如何设置不全部加载所有helper

关于helper的总结

  • rails默认为controller加载所有的helper,所以helper 方法无论写在那个文件中,都可以在view层调用。
  • 设置不要默认加载所有的helper
# Rails >= 3.1 时,通过在配置文件中,添加如下设置:  
config.action_controller.include_all_helpers = false

# Rails < 3.1,默认在ApplicationController中有以下行,删除即可  
helper :all
  • 如果经过以上的配置,那么controller默认就只会加载自己对应的helper,如果controller有继承关系,那么也会加载父类对应的helper
  • 通过在controller中使用以下方法,可以加载制定的helper: helper CommonHelper

rails应用中timezones的正确用法

说明

本文参照翻译了以下博文:

The Exhaustive Guide to Rails Time Zones
作者: Alexander

正文

  • 得到当前时间

正确做法
Time.zone.now

可接受做法
Time.now.in_time_zone
DateTime.now.in_time_zone

错误做法
Time.now
DateTime.now

  • 得到日期(比如今天,昨天等)

正确做法
Time.zone.today
Time.zone.today - 1.day

可接受做法
Date.current
Date.yesterday

错误做法
Date.today

  • 生成Time(Build Time)

正确做法
Time.zone.local(2013, 3, 8, 10, 00)

错误做法
Time.new(2013, 3, 8, 10, 00)
DateTime.new(2013, 3, 8, 10, 00)

  • 从时间戳生成Time(Time from Timestamp)

正确做法
Time.zone.at(Timestamp)

可接受做法
Time.at(Timestamp).in_time_zone

错误做法
Time.at(Timestamp)

  • 解析时间(简单)

正确做法
Time.zone.parse(str)

错误做法
Time.parse(str)

  • 解析时间(按照严格格式)

正确做法
Time.zone.strptime(str, “%Y-%m-%d %H:%M %Z”)
注意:这种比较好的做法,需要引入作者自己写的gem。TimeZoneExt

可接受做法
DateTime.strptime(str, “%Y-%m-%d %H:%M %Z”).in_time_zone

错误做法
DateTime.strptime(str, “%Y-%m-%d %H:%M %Z”)

  • 日期转时间(Get Time From Date)

正确做法
date.beginning_of_day

可接受做法
date.to_time_in_current_zone

错误做法
date.to_time

注意事项

  • ruby的标准库中,比如Time和DateTime类是没有考虑时区(TimeZone)的概念在里面的。

我的octopress博客写法总结

我的octopress博客写法遵循如下:

  • 写小标题分段如下:

小标题

  • 对于在句子中用到的命令,写法如下:

这里是一个命令 git status ,用来查看当前git仓库的状态。

  • 使用 * 进行无须列表,使用 1. 进行有序列表

  • 我是有删除线的

  • 写链接

一篇很好的讲到linux软连接和硬链接的文章

  • 写more, 这样的话就会在主页上显示到这个以上为止,其他的内容省略。(注意以下的感叹号是全角)

    <!– more –>

写代码片段

方法1
(每行前面是一个tab,或者四个空格,特别注意,如果代码code片段前面是一个序列的时候,比如ul,ol,那么这种方法无效)

路径:/usr/local/rvm/rubies/ruby-1.9.3-p286/lib/ruby/1.9.1/webrick
文件:server.rb
方法:GenericServer#start_thread
代码:
addr = sock.peeraddr 改为 addr = sock.peeraddr(:numeric)

方法2

puts 'hello world'

嵌入图片

jsonp处理流程图

嵌入视频

语法高亮

Tips