guides

作者: Jayzen | 来源:发表于2016-04-20 09:06 被阅读79次

    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.测试

    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: "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
    

    相关文章

      网友评论

          本文标题:guides

          本文链接:https://www.haomeiwen.com/subject/xsuzlttx.html