在 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_local
为 true
,并且 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 没有定义这个,可能是其他包里有。
["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
方法来解析请求参数。这就形成了这种参数格式的惯例。
其他域名 +1
便于分布式管理静态文件,比如使用 CDN
12306 竟然是铁路做的
请明示啊
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 放在这个视图里的好了吧?
render :layout =>false
然后在对应的 view 里写返回的文本。
有段时间更新 rvm 后(大概就是上个月的某几天), --default
选项似乎失效了。不过现在好啦。
#5 楼 @zhangjingqiang 这和你的部署方式也有关系。比如,如果是用 Nginx 做反向代理,那么就要把服务器名称和 IP 等信息传给后端。
#2 楼 @zhangjingqiang 你的 Rails 应用部署的时候,是不是反向代理的?
另外,在 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"
这个更别扭了⋯⋯
try
gem install mysql2