• #4 楼 @ichord 可能是文档没有更新吧⋯⋯【猜的】

  • 在 controller 里面实现 local_request? 方法。

    就是在 controller 里重写一下这个方法吧?

    我怎么觉得楼主在翻译 Rails 2.x?Rails-2.3.5 里, ActionController::Rescue里这么定义的:

    # True if the request came from localhost, 127.0.0.1. Override this
    # method if you wish to redefine the meaning of a local request to
    # include remote IP addresses or other criteria.
    def local_request? #:doc:
      request.remote_addr == LOCALHOST && request.remote_ip == LOCALHOST
    end
    
    
    
    

    最终的效果就是,如果 config.consider_all_requests_localtrue,并且 local_request?返回 true,那么抛出异常时,就会是那个错误信息的页面。

          def rescue_action_without_handler(exception)
    #................
            if consider_all_requests_local || local_request?
              rescue_action_locally(exception)
            else
              rescue_action_in_public(exception)
            end
    #................
          end
    
    
    

    BTW. 我以前用 Nginx 反向代理部署了一个 Rails 项目,虽然是 production 模式,但是有异常时,总会渲染那个错误信息页面。后来找到了原因:Nginx 没有把请求的 IP 传递给后边的 Rails 进程,Rails 看到的 IP 都是 127.0.0.1 的,所以渲染那个页面;解决办法是让 Nginx 把 Http 请求的 IP 和主机名传递过去。

    Guide 里的意思是,要想看看某个请求的错误信息,就重写一下 #local_request? ,满足一定条件时,返回 true

    但是,Rails-3 里,貌似没有用到#local_request?,而应该重写 #show_detailed_exceptions? (这个名字挺直观的)

  • 运行一下

    rvm requirements
    
    

    会提示安装很多软件包,楼主安装了么?

  • sorry,不太懂楼主的意思⋯⋯但是一般情况下,路由这么写

    get "home/mm_content/:id" => "some_controller#some_action"
    
    

    FYI

  • #23 楼 @ery 很早的一篇文章供参考 一段 Ruby 代码的解释 。这是 Symbol#to_proc 方法,新版本的 rails 没有定义这个,可能是其他包里有。

    #1 楼 @huacnlee 组合字符串还可以用星号 *

    ["ruby","on","rails"] * " "
    
    
  • ActiveSupport 里的:

    数组分组

    a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
    # => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
    
    a.in_groups_of(2)
    # => [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, nil]]
    
    a.in_groups(2)
    # => [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, nil]]
    
    
    ```
    
    
    矩阵~~转制~~转置
    
    
    ````ruby
    b = a.in_groups(2)
    # => [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, nil]]
    > b.transpose
    # => [[1, 7], [2, 8], [3, 9], [4, 10], [5, 11], [6, nil]]
    
    
    ``````` 
    
  • 如果在 lz 的表单里,name 填写 somename,在 description 里填写 somedescripition,那么点击表单后,浏览器会发送一个 POST 请求给服务器,这 POST 请求的 body 会是如下内容(这是浏览器干的,和 rails 没关系):

    commit=Create&event%5Bdescription%5D=somedescription&event%5Bname%5D=somename
    
    

    服务器在接收到这请求后,就会去解析这个 body。比如,Rack 会这样解析这个字符串(见 https://github.com/rack/rack/blob/master/lib/rack/request.rb 中的 Rack::Request#params 方法)

    s = "commit=Create&event%5Bdescription%5D=somedescription&event%5Bname%5D=somename"
    Rack::Utils.parse_nested_query(s)
    # => {"commit"=>"Create", "event"=>{"description"=>"somedescription", "name"=>"somename"}}
    
    

    假设一个叫 #params 的方法的返回值,是上面的 Hash,那么就可以通过 params['event'] 得到用户输入的表单数据。

    Rails-3 里,就是使用类似方法来解析 GET 请求的查询串和 POST 请求的 body,只不过增加了一些高级功能(比如既可以用字符串作为 Hash 的 key,也可以用 Symbol 作为 key)。具体可以参考 ActionDispatch::Http::Parameters#parameters#params方法是 #parameters的别名。

    由于大多数 ruby web application 都是基于 Rack,而这些 application 大都基于Rack::Utils.parse_nested_query 方法来解析请求参数。这就形成了这种参数格式的惯例。

  • #4 楼 @kevinhua 通过字符串得到“类名”,使用 String#classify比较好,因为会改为单数。比如

    "events".camelize   # => "Events" 
    "events".classify   # => "Event" 
    
    
  • 其他域名 +1

    便于分布式管理静态文件,比如使用 CDN

  • 12306 竟然是铁路做的

  • #2 楼 @jhjguxin 我汗,一时没反应过来

  • 请明示啊

  • rails-2.3.5:development 模式下 nil.id 会抛出异常;但是在 production 模式下,返回 4。太极品了。。

  • 不好意思,没看懂 lz 想表达什么,看到 @hhuai 的回复。我想到了 ActiveResource 里查找类的一个方法供参考:

    ActiveResource::Base#find_resource_in_modules 根据资源名称和模块名称查找类。从模块的最内层到最外层来查找。 ActiveResource::Base#find_or_create_resource_for 调用了这个方法。

    源码见 https://github.com/rails/rails/blob/2-3-stable/activeresource/lib/active_resource/base.rb

    # Tries to find a resource in a non empty list of nested modules
    # Raises a NameError if it was not found in any of the given nested modules
    def find_resource_in_modules(resource_name, module_names)
      receiver = Object
      namespaces = module_names[0, module_names.size-1].map do |module_name|
        receiver = receiver.const_get(module_name)
      end  
      if namespace = namespaces.reverse.detect { |ns| ns.const_defined?(resource_name) }
        return namespace.const_get(resource_name)
      else 
        raise NameError
      end  
    end  
    
    # Tries to find a resource for a given name; if it fails, then the resource is created
    def find_or_create_resource_for(name)
      resource_name = name.to_s.camelize
      ancestors = self.class.name.split("::")
      if ancestors.size > 1
        find_resource_in_modules(resource_name, ancestors)
      else 
        self.class.const_get(resource_name)
      end  
    rescue NameError
      if self.class.const_defined?(resource_name)
        resource = self.class.const_get(resource_name)
      else 
        resource = self.class.const_set(resource_name, Class.new(ActiveResource::Base))
      end  
      resource.prefix = self.class.prefix
      resource.site   = self.class.site
      resource
    end 
    
    
  • 楼主说的应该是这个吧 https://github.com/mbleigh/acts-as-taggable-on 应该是不行的,很多东西都写死了

  • lz 是怎么装 rubygems 的?我记得可以这样

    rvm rubygems remove
    rvm rubygems 1.8.17
    
    

    可否?

  • 还有一些查询,会放在 partial 里,然后缓存一下。比如那些很多地方都使用的 partial。 @xdite 曾经有一篇 blog Rails Performance Tuning (2) – 在 partial 裡面下 query 再做 cache

  • #4 楼 @ywencn 应该是 rails-2 了。rails-2 没有延迟加载,放在 controller 里的话,每次请求都会去查询。

    一般情况下,把查询写在 views 或者 helper 里,会比较慢。当然这是第一次请求比较慢,如果做了片段缓存,下次请求就很快了。

    在某些变态需求里,页面内容很多,有很多 @Rei 所说的非主体部分,放在 controller 里查询可能会很多,导致 controller 很大很乱,偏离了 controller 的目的。我觉得,对于那种可能出现当前请求返回 404 的查询,必须放在 controller 里,其他的可以放在其他地方。

    当然,放在 view 或者 helper 里,管理起来也不轻松。我们写程序可以一个方法只做一件事情,但是很多人设计的页面里,一个页面,非得做 N 件事情,就不能用程序员的逻辑去想了⋯⋯呵呵

    总之:放在 helper 里,是为了片段缓存。

  • 默认渲染视图时,会在外面套上布局(layout),

    render :layout => false
    
    

    返回的就是当前 action 对应的视图,没有 layout。所以你想返回一段 html,就把需要的 html 放在这个视图里的好了吧?

    • kaituanba.com
    • tonghaohui.com
  • render :layout =>false
    
    

    然后在对应的 view 里写返回的文本。

  • 有段时间更新 rvm 后(大概就是上个月的某几天), --default 选项似乎失效了。不过现在好啦。

  • #5 楼 @zhangjingqiang 这和你的部署方式也有关系。比如,如果是用 Nginx 做反向代理,那么就要把服务器名称和 IP 等信息传给后端。

  • #2 楼 @zhangjingqiang 你的 Rails 应用部署的时候,是不是反向代理的?

  • #5 楼 @azhao

    有两个问题:

    1. 这种访问多个离散资源的 URL,有没有现在比较认可的模式(我希望使用约定俗成的东西,而不是自己搞一套规范)?
    2. 这种请求资源的方式应该用 GET 还是 POST?一般来说应该用 GET 请求,因为是幂等的。但是 GET 请求可能造成 URL 过长超出规范长度;使用 POST 请求,又好似修改了服务器的状态,觉得不妥。
  • 另外,在 id 很多的时候,有可能超过 URL 的长度,难道要用 POST 请求?

  • 其实用 rails 的风格,数组应该使用id[]=2&id[12]&id[]=14&id[]=4,查询串应该为

    > {:id => [2, 12, 14, 4]}.to_query
    => "id%5B%5D=2&id%5B%5D=12&id%5B%5D=14&id%5B%5D=4"
    

    这个更别扭了⋯⋯

  • rails 怎么连接 mysql? at 2012年03月03日

    try gem install mysql2