我创建了一个问题,即封装逻辑以上传我的应用程序的某些资源的图像,例如,假设有一个与每个课程相关联的图像,并且对每个用户都是相同的。
module Picturable
extend ActiveSupport::Concern
included do
PATH_IMAGE = File.join Rails.root,"public","#{table_name}_imgs"
after_save :save_image
end
def photo=(file)
unless file.blank?
@file = file
self.extension = file.original_filename.split(".").last.downcase
end
end
def path_image
File.join PATH_IMAGE, "#{self.id}.#{self.extension}"
end
def path_img
"/#{self.class.table_name}_imgs/#{self.id}.#{self.extension}"
end
def has_image?
File.exists? path_image
end
private
def save_image
unless @file.nil?
FileUtils.mkdir_p PATH_IMAGE
File.open(path_image, "wb") do |f|
f.write(@file.read)
end
@file =nil
end
end
end
我编辑了代码,因为有些方法是西班牙语,关注是按预期工作但问题是 table_name 变量,我无法理解值如何变化,有时它获得用户的价值,有时是课程的价值,但当然有时我会得到错误,因为框架在课程文件夹中搜索用户的图像,反之亦然。
我包括关注点的方式如下:
class Course < ActiveRecord::Base
include Picturable
end
我想在图像关联的每个模型中包含关注点,但是我需要将图像保存在代表每个资源的不同文件夹中,假设用户图像应该保存在users_imgs文件夹中,和课程的图像应保存在courses_imgs等中。
我在做错什么或者我的方法是错误的任何线索。
以下是使用rails控制台解释的错误:
由于
答案 0 :(得分:1)
问题是included
块中的常量被覆盖了。你可以通过使用方法而不是常量来解决这个问题。这是一个示例,我已经定义了一个名为image_root_path
的方法来替换常量。
module Picturable
extend ActiveSupport::Concern
included do
after_save :save_image
end
def image_root_path
File.join Rails.root,"public","#{self.class.table_name}_imgs"
end
def path_image
File.join image_root_path, "#{self.id}.#{self.extension}"
end
# ...
private
def save_image
unless @file.nil?
FileUtils.mkdir_p image_root_path
File.open(path_image, "wb") do |f|
f.write(@file.read)
end
@file =nil
end
end
end