我想表演:
XXX.find_or_build_by_language_id(attributes)
Run Code Online (Sandbox Code Playgroud)
我发现
XXX.find_or_initialize_by_language_id(attributes)
Run Code Online (Sandbox Code Playgroud)
但这只设置了language_id而没有其他属性.即使我手动设置属性,当我执行XXX.save时也不会保存记录.
我只是阅读Rails - 查找或创建 - 是否有查找或构建?,这似乎与我的问题有关,但不符合我的需要.
让我们使用这个场景
# db/migrations/create_models.rb
class CreateModels < ActiveRecord::Migration
def self.up
create_table :companies do |t|
t.string :name
end
create_table :employees do |t|
t.string :name
t.string :city
t.references :company
end
end
end
Run Code Online (Sandbox Code Playgroud)
-
# app/models/employee.rb
class Employee < ActiveRecord::Base
belongs_to :company
end
Run Code Online (Sandbox Code Playgroud)
-
# app/models/company.rb
class Company < ActiveRecord::Base
has_many :employees
end
Run Code Online (Sandbox Code Playgroud)
-
# rails console
:001> c = Company.new
=> #<Company id: nil, name: nil>
:002> c.employees
=> [] …
Run Code Online (Sandbox Code Playgroud) 在应用程序中,我需要从 JS 文件实例化音频文件(我正在使用 AudioContext API),或多或少如下所示:
playAudio(url) {
this.audioContext = new (window.AudioContext || window.webkitAudioContext)();
let data = await fetch(url).then(response => response.arrayBuffer());
let buffer = await this.audioContext.decodeAudioData(data)
const source = this.audioContext.createBufferSource()
source.buffer = buffer
source.connect(this.audioContext.destination)
source.start()
}
Run Code Online (Sandbox Code Playgroud)
此 JS 文件是在使用 importmap 和 Sprockets 的新 Rails 7 应用程序中加载的 Stimulus 控制器。
在开发环境中,JS 可以猜测路径,因为 Sprockets 将以规范名称(例如/assets/audio/file.wav
)来服务资产。然而,在生产中,在资源预编译期间,Sprockets 在文件名后添加一个哈希值,并且只能使用/assets/audio/file-f11ef113f11ef113f113.wav
.
该文件名无法进行硬编码,因为它取决于预编译(从技术上讲,我可能可以使用哈希对路径进行硬编码,因为文件不会经常更改,但我不想对此哈希进行任何假设)。
除公共文件夹中的其他资产外,Sprockets 在预编译期间生成的清单中引用了该文件。使用Rails.application.assets_manifest.files
我可以访问清单数据并安全地进行映射。
这是我为此编写的助手:
def audio_assets_json
audio_assets = Rails.application.assets_manifest.files.select do |_key, file|
file['logical_path'].start_with?('audio/')
end
JSON.pretty_generate(
audio_assets.to_h { |_k, f| [f['logical_path'], asset_url(f['logical_path'])] } …
Run Code Online (Sandbox Code Playgroud) 这是我尝试使用CMake 2.8.2重现问题的设置:
/test.sh:
/CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
SET(CPACK_PACKAGE_NAME test)
SET(CPACK_PACKAGE_VERSION 1.0)
LIST(APPEND CPACK_GENERATOR RPM)
SET(CPACK_RPM_POST_INSTALL_SCRIPT_FILE "test.sh")
INCLUDE(CPack)
Run Code Online (Sandbox Code Playgroud)
然后:
mkdir build && cd build && cmake .. && make package
Run Code Online (Sandbox Code Playgroud)
结果:
CPackRPM:警告:CPACK_RPM_POST_INSTALL_SCRIPT_FILE不存在 - 忽略
如何让构建系统知道我的文件test.sh?