• (GoRails) 用app/decorators来取代app/helpers; delegate()方法


    视频:https://gorails.com/episodes/decorators-from-scratch?autoplay=1
    装饰设置风格:把Model层变的干净,但不使用app/helper。model层只保留scope, has_many等等。
    方法:把view中的和数据库关联的逻辑移动到单独设置的一个相关类内,如app/decorators。
     

     
    1. 增加app/decorators目录,并在congfig/application.rb中配置为自动加载。

    config.autoload_paths += %W( #{config.root}/app/decorators) 

    解析: 把[''...根目录/app/decorators"]放入自动加载的目录中。

     
    2. 增加一个user_decorator.rb。新增UserDecorator类,这个类取出User数据库的数据,并根据view的需要来增加一系列相关方法。
     
    view:
     
     
    decorators中的类: 
     
     
    ⚠️: 重点是必须初始化2个变量,user存传入的实例对象,view_context是传入一个类。
     
     
    user_decorator.view_context生成如:
    #<#<Class:0x00007fe6cd9bf198>:0x00007fe6d2918168>对象,
    这个对象的类是#<Class:0x00007fe6cd9bf198>,
    这个类的父类是ActiveView::Base

    controllers/users_controller.rb

     
     
    需要注意的是因为要在使用content_tag方法,这是ActionView::Helpers中的实例方法。因此需要一个实例。所以使用view_context方法。
    view_context方法:是用ActionView::Rendering#view_context生成的一个view类的实例。
    然后,这个实例可以调用content_tag方法了。
     
     
     
     

     

    delegate(*methods, to: nil)

    Provides a delegate class method to easily expose contained objects' public methods as your own.

    delegate :first_name, :last_name, :admin?, :moderator?, to: :user

    UserDecorator的实例对象可以直接使用User类中的公共方法了。

    这里就是@user_decorators可以直接使用 User表格中的属性了。


  • 相关阅读:
    angularjs1.6.4中使用ng-table出现data.slice is not a function的问题
    使用sql语句获取数据库表的信息
    IIS部署web,字体404的问题
    SQL中partition关键字的使用
    asp.net 配置二级域名的共享session,并实现sso单点登录
    同一浏览器中同一JavaWeb程序不共享session方法
    Liquibase的使用
    对象并不一定都是在堆上分配内存的
    阿里面试题,为什么wait()方法要放在同步块中?
    粗浅看 Tomcat系统架构分析
  • 原文地址:https://www.cnblogs.com/chentianwei/p/9573333.html
Copyright © 2020-2023  润新知