IronRuby: Rails-Like MVC without Rails

news/2025/2/23 15:30:07
IronRuby是.NET下的一个Ruby实现,此外还有Ruby.net这一开源项目,二者的主要区别是IronRuby利用了Microsoft最新推出的DLR,而ruby.net则是完全利用原有的CLR实现的,二者的比较可以参考lam John的相关文章。目前IronRuby (SVN r118) 100% 兼容于Ruby 1.5.0规格书,可以顺利运行RubySpec的所有测试与例子,因此大部分Ruby程序都可以不加修改的运行在IronRuby之上,其中包括Rails.

IronRuby的一大特点是,它是基于Microsoft的DLR,因此除了分享ruby世界的资源外,它也可充分利用.NET的庞大资源,例如LINQ,这意味着.NET中的ruby世界,别有一番天地。你可以组合ASP.NET MVC和active record,或者是rails +LINQ,或者完全不需要rails,这完全取决于你的创造力。Lam John演示了如何利用ASP.NET MVC完全实现类似Rails的架构与功能.

先来个简单的"Hello,world"级别的。首先设置routes.(ASP.NET MVC的route)

[code]
$routes.map_route "{controller}/{action}/{id}"
{ :controller='Home', :action='index', id=''}
[/code]

然后与rails的程序类似,开始contoller的编写:
[code]
class HomeController < Controller
def index
view HomeModel.new
end
end
[/code]

和rails不一样的地方在于,其继承的父类是ASP.NET MVC的[color=red]Controller[/color]类 ,而不是rails的[color=red]ApplicationController[/color].

最后在models目录下放入HomeModel.rb,我们的数据来自于内存。
[code]
class HomeModel
def salutation
"Hello,World"
end
end
[/code]

然后是一个最简单的page,你可以命名成aspx,或者遵循ruby世界的规则,以rhtml为后缀,views\home\index.rhtml.
[code]
<h2>$model.saluation</h2>
[/code]

这是一个最简单的MVC例子,稍后是更复杂的例子Controller它有两个action:index和list.
[code]
require "helper/contoller"
require "ProductModel"
class ProductsController < BaseController
def index
model=ProductsModel.new
@message="Hi,Mom"
@categories=mode.get_categories
return_view
end

def list
@category=params[:id]
model=ProductsModel.new
@products=mode.get_products_for_category @category
return_view
end
end
[/code]

这里特别指出的,暂时我们用实例变量与view端通讯,但是Lam John承诺,目前只是作为原型来研究而已,以后必然会做出修改。接下里的model就更简单,它只是visual studio包装的northwind数据库的适配器,这里用到了我后面提到的"mokey patch"方法,从而将C#的GetCategory映射成ruby的get_category.
[code]
require "helpers/model"
class ProductsModel <NorthWindDatabase
//do nothing
end
[/code]
NorthWindDatabase是个C#的类
[code]
public class NorthWindDatabase :NorthWindResposity{
public List<Category> GetCategories(){
return Categories.ToList();
}
public Category GetCategory(String name){
return Categories.SingleOrDefault(c =>C.CategoryName==name);
}

public List<Product> getProductsForCategory(String name){
var category=GetCategory(name);
var products= from p in Products where p.CategoryId==category.CategoryId select p;
return products.ToList();
}
}
[/code]
如果你觉得利用Visual studio生成NorthWind的wrapper不符合你的ruby习惯,那么完全可以把ProductsModel改成ActiveRecord的实现。

view端
[code]
<% $view_data.categories.each{|category|%>
<li> <a href="/products/list/<%=category.category_name%>">
<%=category.category_name%></a>
</li>
<%
}
%>
[/code]

这次view端是完全的asp.net

http://www.niftyadmin.cn/n/1703136.html

相关文章

0515-综合

RichTextBox FlowDocument RichTexBox是个可编辑控件&#xff0c;同样RichTextBox也是一个以Document为主体的一个控件&#xff0c;Document也有段落&#xff08;Paragraph&#xff09;&#xff0c;不过段落中是分为小片小片&#xff08;Inline&#xff09;&#xff0c;我们…

java并发编程实践-性能和可伸缩性

性能的思考 与单线程相比&#xff0c;使用多线程总会引入一些性能的开销,这些开销包括&#xff1a;与协调线程相关的开销&#xff08;加锁、信号、内存同步&#xff09;&#xff0c;增加上下文的切换&#xff0c;线程的创建和消亡。 我们希望CPU做有用的事情&#xff0c;单线程…

0516 prism图形界面

为了自身成长所付出的一切辛劳&#xff0c;未来都会加倍给我们回报的&#xff01;很多时候&#xff0c;甚至不是加倍&#xff0c;而是几何级数的回报&#xff01; 为了自身的成长&#xff0c;为了让自己底气更足&#xff0c;请挣脱环境的束缚&#xff0c;让自己的一切努力都落…

BZOJ3207 花神的嘲讽计划Ⅰ

AC通道&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id3207 这题真正的数据范围&#xff1a;[在dicuss里有原作者发的消息] 100%的数据&#xff1a;1<N<100000;1<M<100000;y-x1<N;K<y-x1&K<20;x<y; 题中所有数据不超过2*10^9;保证方…

IOS的处理touch事件处理(按照手指的移动移动一个圆,开发环境用的ios7,storyboard)...

先看下页面的效果图&#xff1a; 首先定义这个ball它有两个属性和两个方法&#xff1a; property(nonatomic) CGPoint location; property(nonatomic) CGFloat length; -(CGPoint) getCenterPoint; -(BOOL) isInTheBall:(CGPoint) point; 方法体是&#xff1a; //找出ball的中…

每个人都在演 每个人都患浮夸

一直很喜欢“漂”字&#xff0c;而不是“飘”。“飘”&#xff0c;它没有束缚&#xff0c;显得浪漫而自由&#xff0c;更能让人察觉它的存在。但没有依附的飘&#xff0c;犹如浮夸的生活&#xff0c;没有水的依托&#xff0c;就没有了安全感。 我问朋友&#xff0c;什么是浮夸&…

Java中类型转换相关

float a 1.5; //错误&#xff1a;1.5被默认为double型&#xff0c;double不能自动转换成float型&#xff0c;需要强制转换 float b 1.5f; //编译通过byte c 1; //编译通过 /* 因为java中对于默认值为int型的数值&#xff0c;当赋值给当赋给一个比int型数值范围小的…

曝晒一下 2011年度博客大赛奖品

从我的整个IT职业生涯来讲&#xff0c;2011年是一个过去的结束&#xff0c;也是全新未来的开始&#xff0c;除了在工作方面继续为吹过的牛逼奋斗不止外&#xff0c;在专业方面开始转向总结和提炼&#xff0c;把所学所会的知识不断夯实&#xff0c;以期向更高的目标进发。 非常幸…