1.国际化
2.测试
3.插件
1.国际化
案例:
zh.ym&en.ymll文件地址
#console语句
rails g scaffold Article name:string content:text
#model/article.rb
class Article<ActiveRecord::Base
validates :name, presence: true
end
#将zh.yml和en.yml文件放在locales文件夹中
这两个文件用来进行中英文互译
#配置文件config/application.rb,这样子默认显示为中文
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '*.{rb,yml}').to_s]
config.i18n.default_locale = :zh
config.encoding = 'utf-8'
#编辑文件config/locales/zh.yml
zh:
#翻译edit字段
edit: 编辑
#翻译model中的属性值
activerecord:
attributes:
article:
name: "名称"
content: "内容"
#编辑文件config/locales/en.yml
en:
#翻译edit字段
edit: Edit
#编辑文件index.html.erb
<%= link_to (t 'edit'), edit_article_path(article) %>
#修改app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
before_action :set_locale
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
end
#中文显示的url地址
http://localhost:3000/articles?locale=zh
#英文显示的url地址
http://localhost:3000/articles?locale=en
2.测试
常见问题:
#要使用测试文件的时候,需要建立测试数据库,在database.yml文件中进行配置
#需要单独设置username, password
database: test_email
username: root
password: root
#生成数据库文件
RAILS_ENV=test rake db:create
rake db:migrate
或者
db:test:prepare
文件内容的测试的一般形式:
#test/models/article_test.rb
#导入test_helper.rb这个文件
require 'test_helper'
#ActiveSupport::TestCase继承自Minitest::Test
class ArticleTest < ActiveSupport::TestCase
# test "the truth" do
# assert true
# end
end
测试方法的两种形式:
#第一种使用块的形式
test "the truth"do
assert true
end
#第二种使用常规方法的形式
def test_the_truth
assert true
end
测试不通过的几种形式:
#显示“F”,表示测试错误
test "should not save article without title" do
article = Article.new
assert_not article.save
end
#显示E,表示测试文件中有问题
test "should report error" do
# some_undefined_variable is not defined elsewhere in the test case
some_undefined_variable
assert true
end
测试方法罗列
test "the controller" do
#判断正确
assert true
#跳转到help这个action
get :help
#判断反应
assert_response :success
#判断选择器的值
assert_select "title", "Help | #{@base_title}"
end
使得测试有颜色
#gemfile
gem 'minitest-reporters'
#test/test_helper.rb
require "minitest/reporters"
Minitest::Reporters.use!
测试文件进行前运行
def setup
@user = User.new(name: "Example User", email: "user@example.com")
end
3.插件
以生成插件yaffle为例,现在实现如下三个功能:
1.为String类提供实例方法和类方法
2.为Active::Record提供类方法
3.为Active::Record提供实例方法
1.为String类提供实例方法和类方法
rails plugin new yaffle #建立一个插件
#测试见案例
# yaffle/lib/yaffle/core_ext.rb
#建立一个实例方法to_squawk和类方法demo
String.class_eval do
def to_squawk
"squawk! #{self}".strip
end
def self.demo
puts "this is the demo"
end
end
2.为Active::Record提供类方法
#方法的用作(其实不理解,但是代码能看懂):
假如插件的模块中有一个名为last_squawk的方法,与此同时,插件的使用者在其他模块也定义了一个
名为 last_squawk的方法,那么插件允许你添加一个类方法 yaffle_text_field来改变插件内
的last_squawk方法的名称
#测试见案例
# yaffle/test/acts_as_yaffle_test.rb
require 'test_helper'
class ActsAsYaffleTest < ActiveSupport::TestCase
def test_a_hickwalls_yaffle_text_field_should_be_last_squawk
assert_equal "last_squawk", Hickwall.yaffle_text_field
end
def test_a_wickwalls_yaffle_text_field_should_be_last_tweet
assert_equal "last_tweet", Wickwall.yaffle_text_field
end
end
#建立模型和关联
cd test/dummy
rails generate model Hickwall last_squawk:string
rails generate model Wickwall last_squawk:string last_tweet:string
# test/dummy/app/models/hickwall.rb
class Hickwall < ActiveRecord::Base
acts_as_yaffle
end
# test/dummy/app/models/wickwall.rb
class Wickwall < ActiveRecord::Base
acts_as_yaffle yaffle_text_field: :last_tweet
end
#建立acts_as_yaffle方法
# yaffle/lib/yaffle/acts_as_yaffle.rb
module Yaffle
module ActsAsYaffle
extend ActiveSupport::Concern
#这段方法删除也行,不知是何用处
included do
end
module ClassMethods
def acts_as_yaffle(options = {})
cattr_accessor :yaffle_text_field
self.yaffle_text_field = (options[:yaffle_text_field] || :last_squawk).to_s
end
end
end
end
ActiveRecord::Base.send :include, Yaffle::ActsAsYaffle