guides

1.国际化
2.测试
3.插件

1.国际化

案例:
zh.ym&en.ymll文件地址

#console语句
rails g scaffold Article name:string content:text

#model/article.rb
class 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.测试

Testing Rails Applications

常见问题:

#要使用测试文件的时候,需要建立测试数据库,在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: "[email protected]") 
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

你可能感兴趣的:(guides)