【问题标题】:Right way to architect Rails project构建 Rails 项目的正确方法
【发布时间】:2019-11-23 04:16:05
【问题描述】:

这是我当前的 Rails 文件结构:

hello-app
  app
    assets
    controller
    helpers
    models
      application_record.rb
      short_link.rb
      obfuscate.rb

问题:obfuscate.rb 文件位于不属于它的 short_link.rb 文件旁边。

目标:我想将 obfuscate.rb 文件移动到其他位置,请参阅下面的新结构:

hello-app
  app
    assets
    controller
    helpers
    models
      application_record.rb
      short_link.rb
    services
      models
        obfuscate.rb

并将 obfuscate.rb 模块导入 short_link.rb 模型中。

这是我当前的 short_link.rb 模型文件:

require 'obfuscate'

class ShortLink < ApplicationRecord
  include Obfuscate

  def to_param
    encrypt(id)
  end
end

还有我的 obfuscate.rb 文件:

require 'openssl'
require 'base64'

module Obfuscate
  def self.included(base)
    base.extend self
  end

  def cipher
    OpenSSL::Cipher::Cipher.new('aes-256-cbc')
  end

  def cipher_key
    'custom_cipher_key'
  end

  def decrypt(value)
    c = cipher.decrypt
    c.key = Digest::SHA256.digest(cipher_key)
    c.update(Base64.urlsafe_decode64(value.to_s)) + c.final
  end

  def encrypt(value)
    c = cipher.encrypt
    c.key = Digest::SHA256.digest(cipher_key)
    Base64.urlsafe_encode64(c.update(value.to_s) + c.final)
  end
end

另外,将 obfuscate.rb 文件移动到 hello-app>>app>>services>>models>>obfuscate.rb 是一个好习惯吗?或者这个额外的逻辑会有更好的位置吗?

【问题讨论】:

  • 在 Rails 约定中,您可以将模型共享的 mixin 放在 /app/models/concerns/ 中。

标签: ruby-on-rails ruby


【解决方案1】:

如果您的课程不适合app/ 中的任何预定义位置,您可以自己制作。通用名称是 lib/concerns/ 取决于您的偏好,至少在引入此行为的 Rails 5+ 中。在此之前,您需要在应用程序配置中手动添加路径。

在这种情况下,app/lib/obfuscate.rb 将自动加载为 Obfuscate,这正是您想要的。

一般而言,app/*/x.rb 会自动加载为 X,以获取中间的任何值。中间路径名基本无关,只用于组织和分组。

【讨论】:

  • 我会说使用app/lib 是一种反模式。 app 目录用于存放应用程序代码 - /lib 存放不完全是应用程序代码的项目代码。使用/app/models/concerns 更合适。
  • @max 如果它是应用程序的一部分,它就是应用程序代码。 /app 的好处是它会自动重新加载,除config/routes.rb 之外的任何内容都需要手动停止/启动服务器。这会使/app 之外的代码迭代变得更加乏味。您可以随意调用该目录。 /app/models/concerns 应该用于与模型相关的内容,而不是用作非模型代码的垃圾场。
【解决方案2】:

您可以通过这种方式添加子文件夹以自动加载

打开 config/application.rb 并将文件夹路径添加到 autoload_paths

class Application < Rails::Application
  ...
  config.autoload_paths += [
      "#{Rails.root}/app/services/models",
      "#{Rails.root}/app/services/other_folder"
    ]
  end
end

rails 将自动加载该文件夹中的所有模块文件

【讨论】:

猜你喜欢
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
相关资源
最近更新 更多