Lead Frenzy's Blog

星期一, 二月 20, 2012, 12:35 AM ( 1 次浏览 ) - -Ruby & Rails - 
   笔者碰到的问题是这样的:Rails中生成了一系列的二维数组,比如@r_ary = [[0,”a”],[1,”b”],[2,”c”]]],需要直接在网页的Javascript代码中使用这个数组,大概代码如下:
   <script type="text/javascript">
     … …
     var a_ary = <%= @r_ary %>
     … …
   </script>


   在浏览器里运行,并没有得到想要的结果;在IE8中,输出了产生了这样的错误: “消息: 由于出现错误 80020101 而导致此项操作无法完成”。笔者尝试用alert输出结果,显示的结果也没有问题;有点百思不得其解。
   Google一把后,得到的一个启示是转换为JSON数据格式,这样是否可行呢?将上述中间行代码改为:
   var a_ary = <%= @r_ary.to_json %>
   结果令人失望,还是不行。

   后来在查看浏览器重服务器端获取的源码时才发现,Rails在渲染网页代码时,自动进行了html编码,将双引号转变为了”&quot;”,这样原来的数组变成了[[0,&quot;a&quot;],[1, &quot;b&quot;],[3, &quot;c&quot;]],显然这不是我想要的结果,也就导致在JS处理中出错了,得不到想要的结果。
   找到了原因,问题就容易解决了,解决的思路就是让Rails不要对此变量的值进行html编码;自然联想到的方法是html_safe。直接在数据后面试了一下,如下:
   var a_ary = <%= @r_ary.html_safe %>
    服务器端报错,没有这个方法;再尝试了一下先转换为JSON数据格式,再使用这个方法,如下:
    var a_ary = <%= @r_ary.to_json.html_safe %>
    这下可以了,得到了想要的结果。 ^_^

0 引用  | 永久链接  |   | 

星期五, 二月 17, 2012, 10:07 PM ( 3 次浏览 ) - -Ruby & Rails - 
   笔者前面有介绍过如何在通过配置database.yml文件让model能连接不同的数据库,那么如果是在controller的代码中需要动态连接非默认数据该怎么做呢?

   通常默认数据库的连接可以通过如下方式得到:
   default_db_connection = ActiveRecord::Base.connection

   笔者通过摸索,得到两种解决办法(并未从原理上做很深的探究,所以不保证在任何情况下都可行, ^-^):
    方法一:临时改变默认的数据库连接,用完再改回来;比如我们需要连接database.yml定义的new_db_development数据库(假设默认的是development),则可以用如下代码:
    config = YAML::load(File.open('config/database.yml'))
   ActiveRecord::Base.establish_connection(config["new_db_development"])
     …. #your code here
   ActiveRecord::Base.establish_connection(config["development"])


方法二:受model连接非默认数据库方式的启发,可以利用一个空白定义的model来得到数据库连接connection,过程如下:
   1.首先创建一个空白的model,手动编写一个即可,更方便;在app/model文件夹下创建new_db.rb文件,填入如下内容:
   class NewDb < ActiveRecord::Base
     establish_connection :new_db_development
   end

   2.在controller代码中,获得到new_db_development定义的数据库的连接实例:
   new_db_connection = NewDb.connection;
   3.然后在后续代码中即可通过new_db_connection执行对非默认数据库的操作。

   方法二相比方法一的好处是,同时拥有对默认数据库和非默认数据库的连接实例,方便处理。

0 引用  | 永久链接  |   | related link  | 

星期四, 二月 16, 2012, 08:35 PM ( 4 次浏览 ) - -Ruby & Rails - 
   在设计一个可能需要创建大规模用户,并且用户会有很多自定义数据系统的数据库时,为了提高数据库访问的性能,并且易于管理,需要在程序中动态创建数据表,并且同时需要创建用于映射此数据表的model,如何在Rails Web应用的controller中实现呢?参考http://stackoverflow.com/questions/4673 ... e-in-rails 后,笔者实现了如下函数:
   def create_new_table(schema_name, table_name)
     begin
       ActiveRecord::Schema.define do
         create_table "#{schema_name}.#{table_name}" do | t |
           t.integer :aaaa_id, :null=>false
           t.string :aaaa_name, :null=>false, :default=>0
           t.datetime :rec_time, :null=>false, :default=>'2012/2/14 00:00:00'
         end
       end
       model_file = File.join("app", "models", table_name.singularize+".rb");
       model_name = table_name.singularize.camelize;
       File.open(model_file, "w+") do |f|
         f << "class #{model_name} < ActiveRecord::Base\nend";
       end
       return true
     rescue Exception => err
       return err.message
     end
   end

   如果在某个逻辑处理时候,需要在数据库模式new_db中动态创建表 user_10000_tables,并且同时创建好对应的model,则只需调用上述函数,将数据库和表名作为参数传入,在此处例子中的调用方式如下:
    create_new_table “new_db” “user_10000_tables”
    如果数据库适配器的配置没有问题,则执行完后,将会在数据库模式new_db中创建好user_10000_tables数据表,同时在app/models/目录下生成user_10000_table.rb文件,文件的内容如下:
   class User10000Table < ActiveRecord::Base
     establish_connection :new_db_connection
   end


在以后的代码逻辑中就可以通过 User10000Table来使用new_db.user_10000_tables了。

   [2012/2/17 Update: 修改增加连接多数据库]

   上述代码显然只能在默认的数据库中创建表,如果需要动态地在非默认的数据库中创建表,该如何做呢?笔者研究出了两种看似可行的方法,参考笔者的“Rails Controller中动态连接非默认数据库”文章,这里采用第二种方法,修改后的代码如下:
   def create_new_table(schema_name, table_name)
     begin
       ActiveRecord::Schema.define do
        @connection = NewDB.connection;
        create_table "#{schema_name}.#{table_name}" do | t |
          t.integer :aaaa_id, :null=>false
          t.integer :aaaa_name, :null=>false, :default=>0
          t.datetime :rec_time, :null=>false, :default=>'2012/2/14 00:00:00'
        end
       end
       model_file = File.join("app", "models", table_name.singularize+".rb");
       model_name = table_name.singularize.camelize;
       File.open(model_file, "w+") do |f|
        f << "class #{model_name} < ActiveRecord::Base\n\testablish_connection :new_db_connection\nend";
       end
       return true
     rescue Exception => err
       return err.message
     end
   end

上述代码中,假设new_db_connection已经在database.yml中定义好,并且NewDb model也创建好,并可用。如何定义并使用多数据库连接,可以参考本博客前一篇文章:Rails中连接多数据库

0 引用  | 永久链接  |   | related link  | 

星期二, 二月 14, 2012, 05:32 PM ( 6 次浏览 ) - -Ruby & Rails - 
   在考虑Rails如何同时使用多个数据库时,找到这篇文章: http://pullmonkey.com/2008/4/21/ruby-on ... nnections/,挺不错的,顺手翻译一下:

【翻译:】
    在rails论坛回答问题时,看到了多数据库连接的需求。
    需求是:我们需要在一个rails实例中使用两个数据库,更直接点就是我们需要同时使用Oracle和Mysql数据库。怎么做呢?首先,我们需要选择决定哪个数据库是我们的默认数据库,在本场景中,我选择Mysql,那么在database.yml文件中,会有如下配置:
   # in your database.yml file
   development:
     adapter: mysql
     username: root
     password:
     database: example_development

这个相信是大家都比较熟悉的,此时我们的Active Record Models将会使用此mysql连接。

但是,我们同时又需要使用Oracle数据库,因此database.ym配置将会是这样的:
   # in your database.yml file
   development:
     adapter: mysql
     username: root
     password:
     database: example_development

   oracle_development:
     adapter: oracle
     username: root
     password:
     database: example_oracle_development


   到此为止,我们有了两个用于开发的数据库连接,因此,我们需要告诉哪个models使用哪个连接。实际上,我们只需要告诉oracle models去连接oracle_development,所有其他的models连接默认的development。假设,有一个名为user的model,此model对应的数据表是存储在oracle数据库中,user model文件默认是如下样子的:
   #RAILSROOT/app/models/user.rb
   class User < ActiveRecord::Base
   end

   增加如下一行即可让此model连接配置的oracle_development连接:
   establish_connection :oracle_development
   
   如何让此配置更加灵活呢?这样我们在test和production环境中,都不需要改变establish_connection行,比如这样:
   # use RAILS_ENV where RAILS_ENV is generally development, test or production
   establish_connection "oracle_#{RAILS_ENV}"


   为了达到这个目的,相应的database.yml文件配置如下:
   dev_basics: &dev_basics
     username: root
     password:

   <% %w(development test production).each do |env| %>
   <%= env %>:
     <<: *dev_basics
     adapter: mysql
     database: example_<%= env %>

   oracle_<%= env %>:
     <<: *dev_basics
     adapter: oracle
     database: example_oracle_<%= env %>
   <% end %>


  即可!

【2012/2/16 Update】在database.yml新增适配器后,需要重启rails server,否则会出现找不到适配器错误!笔者为此Google了半天.... 汗啊....


0 引用  | 永久链接  |   | related link  | 

星期二, 二月 14, 2012, 01:27 AM ( 6 次浏览 ) - -Ruby & Rails - 
    测试新浪微游戏接口时,发现一个问题:当使用IE浏览器的时候,rails的session无法保存。之前在自己开发服务器上测试时,验证过IE和Firefox都能正常使用session的,觉得很是奇怪。

    通过抓包发现,正常情况下,服务器端在响应客户端访问请求后,在返回的http头中会有Set-Cookies这样的参数,同时在接下来的客户端的http请求头中,会加上Cookie这样的参数;上述不能正常保存session情况下的抓包分析发现,客户端的http请求头中浏览器没有设置Cookie参数。

    解决方法一:修改IE的默认Cookie设置,设置IE隐私设置中的高级隐私设置,勾选“总是允许回话Cookie”,这样session的值就能正常保存了。不过这样肯定不是最好的解决办法,对大多数用户来说,这样做不合理。

    解决方法二:参考方法来自: http://www.sympact.net/2008/07/rails-and-ifram.html ,文中描述了具体原因,是因为IFrame中打开的链接和主页面的链接不在同一个域,所以IE默认会认为是不可信任的,则不允许使用Cookie。解决办法正如文中所示,在controller中的before_filter中增加一个方法,此方法中设置响应的http相应头中增加P3P参数,问题即可解决。
    大致代码如下:

     class ApplicationController < ActionController::Base
       before_filter :set_response
       protect_from_forgery

       def set_response
          response.headers['P3P'] = 'CP="CAO PSA OUR"'
       end
     end


0 引用  | 永久链接  |   | related link  | 

星期六, 一月 14, 2012, 08:38 PM ( 53 次浏览 ) - -旅游&摄影 - 
   前一段时间,参加了点名时间的谷岳( 博客 微博 )南美之旅的点名活动: http://demohour.com/projects/297196 , 今天收到了古岳从南美寄过来的明信片,挺开心的!
    
  

  

  谷岳 -- 一个能追随自己梦想的人,永远支持你!

  

0 引用  | 永久链接  |   | 

星期五, 一月 13, 2012, 12:05 AM ( 27 次浏览 ) - -旅游&摄影 - 
   花了一个晚上,过几天拿到浙江去用。 当然参考了其它图片模版,不过还是为自己还能用PS整图高兴一把 :-)

  

   冬天去海南真的很爽,文昌的海景也是很不错的,总之养老的好去处。

0 引用  | 永久链接  |   | 

星期四, 一月 12, 2012, 11:30 PM ( 24 次浏览 ) - -Ruby & Rails - 
   在学习用Ruby On Rails搭建网站,同时提供后台系统,以及Web Service能力,顺带参考微游戏的PHP SDK实现了Ruby SDK,开源的, ^-^;

   已经放到官方网站上了: http://open.weibo.com/game/index/wiki?title=SDK , 感谢 mxwu (http://weibo.com/mxwu);

   源代码放在github: https://github.com/ldfren/WeiyouxiRubySDK

   自己用单独的Ruby程序和Rails中的Ruby代码测试过,不过bug肯定还是难免,后续使用中再不断完善。

    

0 引用  | 永久链接  |   | 

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 下一页> >>