Java 与Ruby on Rails对接

Java 与Ruby on Rails对接,第1张

Ruby 和rail 回归框架

Ruby和 rail是非常简洁的 很容易 很丰富 我无法避免的连续看到以及听到以上这样的说法 比如说 Bill Walton 写的Rail回顾上关于Ruby的文章提到 如果我告诉你当你使用Rail开发一个Web应用程序可以比你使用一种特定的Java框架开发要快至少十倍的时候 你会怎么想

在尝试了RnR之后 我发现这就是一个伴随旧技术的非常经典的框架

· Ruby是一种非常有力量的语言 就像Smalltalk 我选择静态语言

· 搭建的材料是被动代码生成 就像是IDE wizards或者AppFuse 我选择动态代码生成 或者是更好的——根本就不需要代码生成

· 关系数据库中心 编码发生器和ActiveRecord在表中会被首先想到 然后是在类别中被想到 我选择一种仅仅面向对象的 就像是Hibernate JPA 甚至是ODBMS

· MVC 我正在寻找比旧式MVC框架更新很好的工具

Java的问题 Java开发者

在Java的世界中 生产力是文化问题 而不是技术问题 这就是所谓的这不是Java的错 而是我们的错 我们作为Java开发者需要设计出非常漂亮的体系 以适用于任何地方的GoF模式 使得任何工具都是可再度使用的 把三层架构放到我们所有的系统中以及使用web服务器 我们不是在寻找最直接的方法 所以我们就没办法发现最直接的方法 但是Java 是一种非常简单的语言 使得我们很轻易就可以接近软件开发

Java生产力 其它的方法

解决生产力的一个方法是使用驱动模型 这就是模型环节的开发 仅仅是我们应用程序中的模型环节 就可以使用框架来生产所有的应用程序 MDA OpenXava Trails NakedObjects Roma框架和JMatter都是采用的这种方式

目标

这是所需要应用程序的主要界面

图一

基本上 应用程序推测需要做三件事情

· 列出所有准则的清单

· 创造新准则和编辑现有的准则

· 为某个类别指定合适的准则

Ruby on Rails第一次冲刺

使用RnR的第一步是创建一个新的项目 在命令行你需要输入

$ rails cookbook

现在你必须创建以及配置你的数据库

现在是时间输入你的第一行代码了 在这个例子中使用SQL代码

      drop table if exists recipes;

drop table if exists categories;

create table categories (

id int not null auto_increment

name varchar( ) not null default

primary  key(id)

) engine=InnoDB;

create table recipes (

id int not null auto_increment

category_id int not null

title varchar( ) not null default

description varchar( ) null

date date null

instructions text null

constraint fk_recipes_categories foreign key

(category_id) references categories(id)

primary key(id)

) engine=InnoDB;

显然你需要在数据库上面执行这些语句

最后的步骤是生成Ruby代码 你只需要执行O S框架的下一个命令

$ ruby script\generate scaffold recipe recipe

$ ruby script\generate scaffold category category

现在 你已经拥有RnR应用程序的第一个版本 并且准备运行

很少量的工作 一个简单的 创建表格 然后执行向导 让我们看看结果

Rails结果

这是应用程序的结果

图二

图三

图四

少量的工作 少量的结果

JPA on OX的第一次冲刺

继续使用OpenXava 使用OpenXava的第一步是创建新的项目

$ ant CreateNewProject xml Dproject=CookBook

现在你必须创建以及配置你的数据库

现在是时间输入你的第一步代码了 在这个例子中使用Java代码

      Recipe java:

package okbook model;

import java util ;

import javax persistence ;

import openxava annotations ;

@Entity

@View(members= title; description; date; instructions )

public class Recipe {

@Id @GeneratedValue @Hidden

private Integer id;

@Required @Column(length= )

private String title;

@Column(length= )

private String description;

private Date date;

@Stereotype( HTML_TEXT )

private String instructions;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this id = id;

}

public String getTitle() {

return title;

}

public void setTitle(String title) {

this title = title;

}

public String getDescription() {

return description;

}

public void setDescription(String description) {

this description = description;

}

public Date getDate() {

return date;

}

public void setDate(Date date) {

this date = date;

}

public String getInstructions() {

return instructions;

}

public void setInstructions(String instructions) {

this instructions = instructions;

}

}

Category java:

package okbook model;

import java util ;

import javax persistence ;

import openxava annotations ;

@Entity

public class Category {

@Id @GeneratedValue @Hidden

private Integer id;

@Required @Column(length= )

private String name;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this name = name;

}

}

最后一个步骤是生成数据库图表 你只需要执行项目中的一个小目标

$ ant updateSchema

现在 你已经拥有OpenXava应用程序的第一个版本 并且准备运行

少量的工作 简单的POJO 以及执行 更新图表 让我们看看结果

OpenXava结果

这是应用程序的结果

图五

图六

注意 用户可以创建更新 删除 从列表生成PDF 将列表输入到excel 每一列的命令 大型结果和过滤数据的支持分页 而且你可以直接部署 不需要代码 仅仅是执行一个小目标 JSR 入口上的应用程序 以及OpenXava的look & feel能够适用于入口的look & feel 这就是一个应用程序准备产出的第一步

少量的工作 完美的结果

观察这里RnR 与 OX之间的差别 一个冷静的观点是在RnR中 你先输入表 而在OpenXava中先输入类别

控制器

Rails引起basic CRUD的控制逻辑 你在下面可以看到

图七

另一方面 OX不会为CRUD生成任何代码 OpenXava仅有一个属性代码 可以执行CRUD和打印 将自动化配置给所有的实体 你可以书写你自己的属性CRUD逻辑 或者你可以为一个特有的实体书写详细逻辑 但是你不会为每一个实体设置控制代码 使用这种方法 你需要维护少量的代码 并且你可以改变CRUD独立单元的逻辑

Rails使用合成码 OX使用属性代码

你可以在OpenXava wiki上面学到更多的OX控制器知识

增加关联

为了规范在Ruby中从类别增加关联 你需要在category rb中书写如下代码

图八

以及在recipe rb中

图九

相当简单 但是 你要做更多的工作 你必须编译

cookbook \app\views\recipe\_form r

增加如下代码

      <p><labelfor= recipe_category_id >Category</label><br/>

<%= select( recipe category_id Category find(:llect{|c| [c name c id] }) %></p>:

结果是

图十

在这个环节 OpenXava中 你不得不在Category java中使用JPA规定关联

     @ManyToOne(optional=false) @DescriptionsList

private Category category;

and in Recipe java:

@OneToMany(mappedBy= category )

private Collection recipes;

而且你不需要接触任何类似HTML代码 应用程序将会显示如下

图十一

你有一个为修改产生的链接或者从这里创建新类别

不增加任何辅助编码 如果使用者使用类别单元 他将获得每一个类别中准则的收集 如下所示

图十二

在这里 RnR应用程序还是不具备这种特性 你需要书写一些Ruby 和HTML代码来实现一样的结果

在这一块 RnR 和 OX的主要差别是 在OX中你不需要书写任何HTML类似的代码 事实上你连用户界面代码都根本不需要书写

精确的基础资料

Ruby on Rails指导的下一个步骤是为一种特性生成基础资料 在RnR中你不得不编译控制编码从而达到这个目的 让我们开看看

修改以及更新的方法是增加如下代码行

      @recipe date = Time now

The equivalent in OX is adding the @DefaultValueCalculator annotation in model:

@DefaultValueCalculator(CurrentDateCalculator class)

private Date date;

用一种更为公开的方法获得一样的结果

在这里 尽管RnR中在控制器上放置的代码 OX中统计基础资料的代码 为了确认以及业务逻辑 一般来说是放在模型上 OX促进从控制器转移业务逻辑到模型上

RnR的相关文章中提到 我改良模型文件 所以我需要重新启动我们的web服务器 尽管使用Eclipse WTP 我只需要按一下Ctrl 加上B 在浏览器上点击刷新以便于看见OpenXava应用程序上面模型的变化

结论

Ruby on Rails 和 OpenXava之间最主要的差别是RnR是 MVC框架 你不得不书写模型和控制器 OX是模型驱动框架 你只需要书写模型 结果就是更少的代码 更好的程序

lishixinzhi/Article/program/Java/JSP/201311/19267

假设您有一个可以工作的 Ruby 应用程序,并且需要向其添加电子邮件传递功能。这可能与用户身份验证或任何其他类型的事务性电子邮件有关,这没有什么区别。本教程旨在帮助您实现使用 Ruby 发送电子邮件。

用 Ruby 发送电子邮件的选项

大多数情况下,你可以从三个选项中选择一个。

最简单的方法是使用 Net: : SMTP 类。它提供了通过 SMTP 发送电子邮件的功能。该选项的缺点是 Net: : SMTP 缺少撰写电子邮件的功能。你可以自己创建,但这需要时间。

第二种选择是使用专用的 Ruby gem,如 Mail、 Pony 或其他。这些解决方案使您能够以简单有效的方式处理电子邮件活动。Action Mailer 是一个完美的电子邮件解决方案,通过 Rails 的棱镜。而且,很有可能,这将是你的选择。

第三个选项是类 Socket。通常,这个类允许您设置流程之间或流程内部的通信。因此,电子邮件发送也可以用它来实现。然而,事实是 Socket 并没有为您提供广泛的功能,您也不太可能想要使用它。

现在,让我们尝试使用所描述的每个解决方案发送电子邮件。

如何通过 Net: : SMTP 在 Ruby 中发送电子邮件

根据我的经验,在一个普通的 web 应用程序中使用这个选项是不常见的。但是,如果您在某些物联网设备上使用 mruby (Ruby 语言的一种轻量级实现) ,那么通过 Net: : SMTP 发送电子邮件可能是合适的。此外,如果在无服务器计算中使用,例如 AWS Lambda,它也会这样做。首先查看这个脚本示例,然后我们将详细介绍它。

Ruby 露比

这是一个通过 SMTP 发送文本电子邮件的简单示例(可以在这里找到官方文档)。您可以看到四个标题: 发件人、收件人、主题和日期。请记住,您必须将它们与电子邮件正文中的空行分开。同样重要的是连接到 SMTP 服务器。

Net::SMTPstart('yoursmtpserver', 25) do |smtp|

Start (‘ yoursmtpserver’,25) do | smtp |

自然,这里将显示您的数据,而不是“ yoursmtpserver”,并且25是默认端口号。如果需要,可以指定其他详细信息,如用户名、密码或身份验证方案(普通、登录和 cram _ md5)。它可能看起来如下:

`Net::SMTPstart('yoursmtpserver', 25, ‘localhost’, ‘username’, ‘password’ :plain) do |smtp|`

在这里,您将使用纯文本格式的用户名和密码连接到 SMTP 服务器,客户机的主机名将被标识为 localhost。

之后,可以使用 send _ message 方法并将发送方和接收方的地址指定为参数。

Start (‘ Net: : SMTPstart (‘ yourSMTPserver’,25) do | SMTP |’)的块形式将自动关闭 SMTP 会话。

在 Ruby Cookbook 中,使用 Net: : SMTP 库发送电子邮件被称为极简主义,因为您必须手动构建电子邮件字符串。尽管如此,这并不像你想象的那样没有希望。让我们看看如何用 HTML 内容增强电子邮件,甚至添加附件。

在网上发送 HTML 电子邮件: : SMTP

查看这个引用消息部分的脚本示例。

Ruby

除了消息体中的 HTML 标记之外,我们还有两个额外的头: MIME-Version 和 Content-type。MIME 指的是 MIME。它是 Internet 电子邮件协议的扩展,允许您在单个消息体中组合不同的内容类型。MIME-Version 的值通常为10。它指示消息是 MIME 格式的

至于 Content-type 头,一切都很清楚。在我们的示例中,有两种类型-HTML 和纯文本。另外,确保使用定义的边界分隔这些内容类型。

除了 MIME-Version 和 Content-type,您可以使用其他 MIME 头:

内容-传输-编码-表示二进制到文本的编码方案(7位、 Quoted-printable、 base64、8位或二进制)。

在网上发送带附件的电子邮件: : SMTP

- Content-Disposition-指定表示样式(内联或附件)

让我们添加一个附件,例如 PDF 文件。在这种情况下,我们需要将 Content-type 更新为 multipart/mix。另外,使用 pack (“ m”)函数用 base64编码对附加文件进行编码。

Ruby

之后,你需要定义你的电子邮件的三个部分。

第1部分-主要标题

第2部分-消息行动

第三部分-附件

现在,我们可以把所有的部分放在一起,并最终确定剧本。这就是它看起来的样子:

Ruby

我可以发送电子邮件给多个收件人在网络: : SMTP?

当然,你可以 send _ message 期望第二个和随后的参数包含收件人的电子邮件。例如:

Ruby

发送电子邮件的最佳 Ruby Gems

在 Ruby 生态系统中,您可以找到特定的电子邮件 gems,它们可以改善您的电子邮件发送体验。

Ruby Mail

该库旨在提供一个单点访问管理所有电子邮件相关活动,包括发送和接收电子邮件。

Pony

您可能听说过一个关于用一个命令发送电子邮件的童话故事。抓紧你们的帽子,因为它是真的,由小马宝石提供。

ActionMailer

这是最流行的宝石发送电子邮件在 Rails 上。如果你的应用程序写在上面,ActionMailer 肯定会出现。它允许您使用邮件类和视图发送电子邮件

使用邮件陷阱测试使用 Net: : SMTP 的电子邮件发送

设置非常简单。进入演示收件箱后,复制 SMTP“设置”选项卡上的 SMTP 凭据并将其插入到代码中。或者,您可以在 Integrations 部分获得一个简单消息的即用模板。只要选择一种编程语言或框架,你的应用程序是建立。

Ruby

如果一切正常,您将在邮件陷阱演示收件箱中看到您的消息。此外,您可以尝试检查您的 HTML 内容和附件的电子邮件。

您刚刚阅读了关于如何使用 Ruby 测试和发送电子邮件的完整教程。希望您喜欢!

1 打开你的bash_profile, 把 export PATH=/usr/local/Cellar/ruby/193-p327/bin:$PATH 加进去

2 bash_login只是针对iterm的吧,真正对环境变量起作用的是bash_profile,当然一般bash_profile也会加载bashrc的内容,所以你也可以在bashrc里面修改

ps: 这些应该是 shell的基本知识

在 Ruby 项目中,特别是 Rails 项目,使用 bundler 管理 Gem 时,有一些 Gem 需要用到系统库。例如 Rails 项目中默认需要的 Nokogiri 在 bundle install 时好多人遇到这样的错误:

还可以看 Github 上相关的 [issue](Nokogiri 168 Install Fails on Mac OS X with xz installed from Homebrew)

还有一个例子就是 mysql2 也需要用到系统脚本,请看其 Readme

还有 bundle install 时比较常见的错误就是 libv8 的安装,Readme 给出的安装方法是:

事实上,好多 Gem 在 build gem native extension 都会用到系统库。

当把这些需要依赖系统其他库的 Gem 使用 Rubygem 时可直接在后面加上 -- --with xxxx 但是我们使用 bundler 管理 Gem 时,就需要在 bundle install 之前之行相应的 bundle config buildxxx ,那么,是否有一种方式我们直接把这些需要在 bundle install 之前的命令写在一个配置文件里面,然后我们直接 bundle install 呢?

答案是有的。

事实上,如果你执行了 bundle config buildxxx 命令之后, ~/bundle/config (~ 表示当前用户目录)会填充一些内容,比如我们执行 :

该文件就会追加一行内容: BUNDLE_BUILD__LIBV8: "--with-system-v8"

其实我们也可以为 Bundler 管理的 Ruby 项目添加这样的特性,譬如:

在 Rails 项目根目录下新建 bundle 文件夹,并且新建 config 文件,以后这个项目 bundle 的一些设置就可以写在 config 文件中了。来看看一个模版:

BUNDLE_PATH: vendor/bundle 表示 bundle install 的 gem 全部在 vendor/bundle/ 目录下,而不是在 $GEM_HOME 或者 $BUNDLE_PATH 目录下;然后其他的就是一些依赖系统库的配置。

更多关于 bundler 配置的文档,请看 bundle config

另外再推荐一篇文章: Configuring bundler using bundle config

以上就是关于Java 与Ruby on Rails对接全部的内容,包括:Java 与Ruby on Rails对接、用 Ruby发邮件、Mac OS X 下配置 ruby 环境变量的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/10150387.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存