冒险村27 - Concern

27 - Concern

最後整理的方式再来讲到 Rails 提供功能,主要目的在把相同逻辑 code 整理在一起,需要使用的时候再 include 近来即可使用,有点类似继承的概念,但又不想要所有东西都继承起来。或许会发生有一两个特别的不需要使用到,这时候就可以使用 Concern 来处理。

用途主要在:

  1. 用於将程序写在同一个 concern,提高可读性也方便重构。
  2. 把 model or controller 重复的功能写在同一个 concern。

Create concerns folder in controller or model folder

  • users_concern.rb

Add app > controllers > concerns > users_concern.rb

module / concern 两种写法的定义都相同,看习惯写成什麽样子都可以,我个人常看到的是 module + included。

  # definition(1)
  module UserConcern
    extend ActiveSupport::Concern
    
    def self.included(base) 
      base.instance_eval do
        scope :some_thing_scope, -> {...}
        has_many :table
      end
      # or
      # base.class_eval do
      #   ...  
      # end
    end

    #or
    included do
      #...
    end
  end

  # definition(2)
  concern UserConcern do 
    ...
  end

看完上述的写法,以 user controller 整理举例:

  # frozen_string_literal: true
  module UserConcern
    extend ActiveSupport::Concern
    # render_404_if_user_id_invalid in here
    include ValidateParams

    included do
      before_action -> { render_404_if_user_id_invalid(params[:id]) }
      before_action :set_basic_user_instances
    end

    def set_basic_user_instances
      @some_instances = ...
      # ...
    end
  end
  class UserController < ApplicationController
    include UserConcern
    # ...
  end

而相同的,model 也可以用相同的方法整理再一起,这边也不另外举例了。

My blog


<<:  30天学会Python: Day 26-一心多用

>>:  大脑如何精准学习 (1) 注意力

【rails】串接Google第三方登入失败,Authentication failure! authenticity_error

此时此刻看着这篇文章的你,是否也遇到下图的错误讯息,反覆检查程序码,也确实参照官方文件1、官方文件2...

Day 0x19 UVa10929 You can say 11

Virtual Judge ZeroJudge 题意 输入一整数,判断是否为 11 的倍数 需要注...

发送图片与添加元素

前情提要 关於cog,当指令越写越多的时候,可以运用Cog的架构。 Cog可以视为一个extensi...

第39天-学习 od 指令

进度 : 鸟哥的 Linux 私房菜 -- 第六章、Linux 档案与目录管理 快速查询对应 ASC...

Visited:我最喜欢的Node.js上的开源命令行工具

最近,我偶然发现了一个软件,"Visited",一个建立在Node.js上的开源...