- 浏览: 488532 次
- 性别:
- 来自: 济南
文章分类
最新评论
-
effort0829:
更重要的是可以通过 URL打开特定的资源,然而再windows ...
【转载】自定义URL Protocol 协议 -
追梦人zxy:
mark。我记得cglib代理的话就用set注入
通过CGLIB实现AOP的浅析(顺便简单对比了一下JDK的动态代理) -
zacry:
这个问题最近也困扰了我很久,我是从一个老项目里迁移代码时遇到的 ...
通过CGLIB实现AOP的浅析(顺便简单对比了一下JDK的动态代理) -
bo_hai:
netfork 写道哎,大家都回家过中秋节了,自己的问题,自己 ...
Struts 2中验证失败后,radio回复到默认值的问题 -
greatghoul:
看不出有什么严重的,加上 <%- %> 不就可以了 ...
不要在erb中加注释,后果很严重
搜了一下关于ror二级域名的文章,都是零零散散的,最终也没能找到讨论明白的,下面是自己根据一些讨论提供的线索,猜想了一下实现的方式,可以实现类似javaeye的二级域名效果,但是可能实现的很粗笨很无知,所以请知情者狂拍我,不胜感激。
总体划分为两部分进行处理:
1、在routes.rb中,增加对没有controller请求的路由,并在ApplicationController中进行处理。主要解决直接以类似http://netfork.iteye.com访问的情况。
2、在ApplicationController中增加二级域名过滤器。主要解决以类似http://netfork.iteye.com/blog/XXX形式访问的情况。
先说第一部分的处理:
1、在routes.rb中增加下面的代码:
map.connect '', :controller => 'application', :action => 'subdomain_dispatch'
2、在ApplicationController中增加对应的action。具体参考以下代码示例,取得二级域名,如果非空也非www,则根据此域名取得对应的公司信息。
# 二级域名路由 def subdomain_dispatch # 取得二级域名 subdomain_name = request.subdomains.first.to_s if !subdomain_name.blank? && subdomain_name != 'www' # 根据二级域名,取得对应的公司信息 @company = Company.find_by_domain_name(subdomain_name) if @company # 声明布局模板 render :template => "/company/show", :layout => "company" else redirect_to :controller => 'index' end else redirect_to :controller => 'index' end end
经过以上两步,直接以http://netfork.iteye.com这种形式请求时,就能自动提取到相应的二级域名信息,并根据二级域名获取到相应的数据。
再来说一下第二部分:
第一部分主要解决了http://netfork.iteye.com形式访问,但是,如果想实现http://netfork.iteye.com/blog/xxx形式也能正常路由,且不是redirect形式,就需要借助于ApplicationController的过滤器来实现。
# 二级域名过滤 before_filter :subdomain_filter # 二级域名过滤器 def subdomain_filter subdomain_name = request.subdomains.first.to_s # 判断是否允许使用二级域名进行处理 if subdomain_name != "www" && ["companies", "news", "msg", "user"].include?(controller_name) redirect_to request.url.to_s.sub(subdomain_name, "www") return false else params[:company_name] = subdomain_name end end
其实原理就是在过滤器中,将二级域名取出来,然后判断一下,此域名是否允许作为二级域名处理,如果不允许,则直接重定向至www开头的域名中,如果属于二级域名过滤的范围,就将二级域名设到params中,继续向后执行。
比如以下的域名:
http://netfork.hulian56.com/company/about
只需要在company控制器的about这个action中执行如下代码,即可获得netfork对应的about信息。
@company = Company.find_by_domain_name(params[:company_name])
这样,就解决了以二级域名打头后面带着特定请求的问题了。
完。
评论
我的实现与老大的描述原理上大体相近,javaeye的完整实现思路印证了我的一些猜想,让我对自己实现的这部分代码有了信心。
再次向robbin致谢。
def blog? if request.subdomains && request.subdomains[0] && request.subdomains.length == 1 && !RESERVED_DOMAIN.include?(request.subdomains[0]) @blog_owner ||= User.find_by_domain(request.subdomains[0]) return !@blog_owner.nil? end return false end def group? if request.subdomains && request.subdomains[1] && request.subdomains[1].eql?("group") && request.subdomains.length == 2 @group ||= Group.find_by_domain request.subdomains[0] return !@group.nil? && @group.active? end return false end
/blog/xxx 就是标准的Rails路由映射,只不过这种controller需要加一个filter去判断进来的域名,如果不是博客域名访问过来的话就要redirect。
before_filter :blog_domain_required, :except => [:rss_blog, :show] def blog_domain_required redirect_to homepage_url and return false unless blog? end
# show website homepage def homepage if www? render :template => 'main/homepage', :layout => false elsif app? if logged_in? render :template => 'app/base/index', :layout => 'app' else redirect_to homepage_url end elsif job? render :template => 'job/homepage', :layout => 'job' elsif channel? @channel = request.subdomains[0] if File.exists?("#{RAILS_ROOT}/app/views/channel/#{@channel}/index.rhtml") render :template => "channel/#{@channel}/index", :layout => 'channel' else render :file => "#{RAILS_ROOT}/public/404.html", :status => 404 end elsif blog? @blogs = @blog_owner.blogs_by_page params[:page] render :template => 'blog/index/index', :layout => 'blog' elsif group? Group.increment_counter(:visit_count, @group.id) render :template => 'group/index/index', :layout => 'group' else redirect_to homepage_url end end
protected def www? return request.subdomains && request.subdomains[0] && request.subdomains.length == 1 && request.subdomains[0] == 'www' end def job? return request.subdomains && request.subdomains[0] && request.subdomains.length == 1 && request.subdomains[0] == 'job' end def app? return request.subdomains && request.subdomains[0] && request.subdomains.length == 1 && request.subdomains[0] == 'app' end def channel? return request.subdomains && request.subdomains[0] && request.subdomains.length == 1 && RESERVED_DOMAIN.include?(request.subdomains[0]) end
判断一下subdomains,根据不同的域名做不同的处理,就这么简单。
谢谢robbin老大的回复。
我的作法也是参考了你n年前的只言片语写的,这回算是有幸见着原装的了。
有一个问题,就是比较关键的 blog? 方法能放上来吗?
还有一个问题,就是如:http://netfork.iteye.com/blog/XXX这样的效果似乎上面的代码并没有给出实现方法吧。
# show website homepage def homepage if www? render :template => 'main/homepage', :layout => false elsif app? if logged_in? render :template => 'app/base/index', :layout => 'app' else redirect_to homepage_url end elsif job? render :template => 'job/homepage', :layout => 'job' elsif channel? @channel = request.subdomains[0] if File.exists?("#{RAILS_ROOT}/app/views/channel/#{@channel}/index.rhtml") render :template => "channel/#{@channel}/index", :layout => 'channel' else render :file => "#{RAILS_ROOT}/public/404.html", :status => 404 end elsif blog? @blogs = @blog_owner.blogs_by_page params[:page] render :template => 'blog/index/index', :layout => 'blog' elsif group? Group.increment_counter(:visit_count, @group.id) render :template => 'group/index/index', :layout => 'group' else redirect_to homepage_url end end
protected def www? return request.subdomains && request.subdomains[0] && request.subdomains.length == 1 && request.subdomains[0] == 'www' end def job? return request.subdomains && request.subdomains[0] && request.subdomains.length == 1 && request.subdomains[0] == 'job' end def app? return request.subdomains && request.subdomains[0] && request.subdomains.length == 1 && request.subdomains[0] == 'app' end def channel? return request.subdomains && request.subdomains[0] && request.subdomains.length == 1 && RESERVED_DOMAIN.include?(request.subdomains[0]) end
判断一下subdomains,根据不同的域名做不同的处理,就这么简单。
http://github.com/mbleigh/subdomain-fu/tree/master
怎么配呢?
发表评论
-
ruby访问mysql,报mysql_api.so (LoadError)
2010-09-23 22:45 1910转自:http://hi.baidu.com/vincent% ... -
用rails写了一个项目管理系统
2010-08-16 00:40 1775前段去杭州出差,收获 ... -
我好衰,Ubuntu上遇到rails3没法正常启动应用的麻烦
2010-06-07 00:24 1697最近终于迷上了Ubuntu,听Cedric说,ruby1.9+ ... -
在ubuntu下试了一下vim写rails
2010-05-31 00:31 1292果然不错。。。 看了一下时间,一不小心到凌晨了,搞技术就是辛 ... -
Windows下Apache+Mongrel运行不了的问题
2010-01-12 21:43 1127在使用Apache+Mongrel搭配运行时,有时候无法运行, ... -
couldn't load font "宋体 9", falling back to "Sans 9", expect ugly output.
2009-12-20 13:47 2802Windows下使用Ruby-GNOME2写GUI时,会报以下 ... -
Redmine真的是相当好用!!
2009-10-11 17:11 1547rails+java,所向无敌! 力挺Redmine!做的很不 ... -
“Mysql server has gone away” with Rails
2009-09-29 10:22 1671http://stackoverflow.com/questi ... -
不要在erb中加注释,后果很严重
2009-09-27 10:48 3994在erb中加了两行注释,上了Linux生产环境后,生成的htm ... -
Override automatic updated_at in ActiveRecord/Rails
2009-09-27 10:24 1101http://www.neeraj.name/blog/art ... -
改了数据库密码后,一定勿忘!
2009-09-23 21:46 843lighttpd/fastcgi这种配置下,当改了db密码后, ... -
exception_notification那是相当的好用
2009-09-23 15:18 923http://hellosoft.iteye.com/blog ... -
上线前最终定rails版本:2.3.4
2009-09-21 00:04 927呼呼!! -
使用Rails的Cache缓存了站内信
2009-09-15 14:55 1308通过Rails.cache来缓存当前登录用户的站内信条数,当其 ... -
导入cache_fu
2009-09-15 00:39 1079cache优化是长期的工作,今天通过cache_fu优化了一部 ... -
修改will_paginate支持ajax方式
2009-09-13 20:09 0转自http://www.iteye.com/topic/18 ... -
memcached+timed_fragment_cache
2009-09-11 23:48 15271、memcached (1)windows ... -
重启大法
2009-09-06 17:16 1002在调试rails时,如果感觉确实没问题,结果死活调不通时,重启 ... -
多态下的counter_cache
2009-09-05 09:22 1161做rails的人是幸福的,因为有时候没必要一定要看专门的api ... -
对于attr_protected字段
2009-09-03 19:23 752update_attribute可以更新,update_att ...
相关推荐
RoR(Ruby on Rails)是一种流行的开源Web开发框架,以其高效和简洁的代码著称。然而,随着网站规模的增长,性能优化成为必不可少的环节。在本文中,我们将探讨一些RoR性能优化的关键方面,主要基于JavaEye网站在...
RoR强调“约定优于配置”,提供了一套完整的工具链,使得开发者可以更专注于业务逻辑,而不是底层实现。 在提供的压缩包文件中,我们可以看到"Ruby语言中文教程",这暗示了资源可能包含了关于Ruby语言的基础知识和...
2. 函数式编程元素:支持闭包和块,可以实现简洁的代码结构。 3. 强大的元编程能力:Ruby允许在运行时修改类和对象,增强了灵活性。 **二、Rails框架** 1. MVC架构:Rails将应用程序分为模型(Model)、视图(View...
NULL 博文链接:https://xuxiangpan888.iteye.com/blog/266696
"ror实例"可能指的是在学习或实践中,通过创建一个具体的Rails应用程序来理解和掌握RoR的工作原理和最佳实践。 在Ruby on Rails中,重要知识点包括: 1. **Gemfile与Gemfile.lock**:项目中的Gemfile用于指定项目...
在深入研究RoR源代码时,建议先从官方文档和开源项目开始,例如GitHub上的Rails项目,这能帮助你理解框架的设计思路和实现细节。同时,参与开源社区,阅读他人的代码和贡献自己的代码,是提升技能和了解最新实践的好...
在Ruby on Rails(ROR)开发环境中,安装和配置正确的依赖包是至关重要的。这个压缩包包含了一系列用于ROR框架的基础组件,但不包括Ruby本身。让我们深入了解一下这些包的作用和重要性。 首先,`actionpack`是Rails...
3. **用户界面设计**:在Windows环境下,可能会有窗口、控件、菜单和对话框的设计与交互实现,这些是提升用户友好性的关键。 4. **错误处理和调试**:高级程序设计会包含对异常的捕获和处理,以及调试技巧,帮助...
在CIFAR-10上达到89%的准确率,以及在CIFAR-100上达到72%的准确率,展示了ResNet和Ror模型在处理复杂图像分类任务上的强大能力。相比于其他传统的浅层网络或早期的深度网络,这样的准确率显著提高了模型的性能,表明...
基于RoR的博客系统,代码风格简单清晰,前后太完善,适合初学者。
**敏捷开发第二版ROR必看** ...总之,"敏捷开发第二版ROR必看"是一个全面而深入的学习资源,适合所有希望提升自己在Ruby on Rails和敏捷开发方面技能的程序员。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。
破解版本的JAR包,放到本地磁盘,ECLIPUS直接用,到JVM设置直接加 -noverify -javaagent:D:\javarebel.jar
8. **会话和cookies**:为了实现用户登录和权限管理,需要理解Rails中的会话和cookie机制,确保用户状态的跟踪。 9. **部署与测试**:最后,学习如何将项目部署到服务器,如Heroku或AWS,并使用RSpec、Capybara等...
为了正确地处理二进制文件,必须在表单中设置`enctype="multipart/form-data"`属性,这是通过在Rails的`start_form_tag`辅助方法中设置`multipart => true`选项来实现的。 ```erb ({:action=>'create'}, {"name"=>...
- **课程性质**:本课程为为期五天的Ruby on Rails(简称RoR)入门级培训,适合初学者快速掌握RoR的基本概念和技术要点。 - **讲师信息**:由Peter Marklund开发并讲解,Peter是一位经验丰富的Ruby on Rails开发者。...
2. **快速开发**:利用RoR的生产力优势,FreeMIS的开发周期相对较短,能够快速实现功能迭代。 3. **易用性**:RoR的模板引擎和视图层设计使得FreeMIS的用户界面友好,用户体验良好。 4. **社区支持**:RoR拥有庞大的...
### Windows上搭建Ruby on Rails(ROR)环境详解 #### 一、引言 随着Web开发技术的不断发展,Ruby on Rails(简称Rails或ROR)作为一种高效、简洁且优雅的Web开发框架,受到了广大开发者的青睐。然而,在Windows...
总结来说,配置ROR开发环境包括安装Ruby、Rails,创建ROR项目,以及在Eclipse中设置ROR插件和导入项目。在Eclipse中进行ROR开发,可以充分利用其丰富的功能,提升开发效率。理解并熟练运用ROR的MVC架构和相关工具,...
RoR还支持RESTful设计,这是一种基于HTTP协议的Web服务设计风格,可以轻松实现资源的创建、读取、更新和删除操作。TDD(测试驱动开发)也是RoR强调的一个重要方面,它鼓励开发者先写测试,再编写满足测试的代码,...