当前位置: 代码迷 >> 综合 >> IronRuby: Rails-Like MVC without Rails
  详细解决方案

IronRuby: Rails-Like MVC without Rails

热度:74   发布时间:2023-12-10 05:28:01.0
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
  相关解决方案