Ruby on rails 访问ActiveSupport::Concern模块中的模型属性

Ruby on rails 访问ActiveSupport::Concern模块中的模型属性,ruby-on-rails,activerecord,ruby-on-rails-4,Ruby On Rails,Activerecord,Ruby On Rails 4,我有一些模型在其他路径上共享相同的功能。所以我决定将这些方法放在一个模块中,并在模型中设置路径。我的问题是无法访问模块中的属性 型号: class Job < ActiveRecord::Base include ImageModel image_dir = "jobs" end 我得到的错误是: undefined local variable or method `image_dir' for #<Job:0x007f8a93b9e8d8> 我是错过了什么还是

我有一些模型在其他路径上共享相同的功能。所以我决定将这些方法放在一个模块中,并在模型中设置路径。我的问题是无法访问模块中的属性

型号:

class Job < ActiveRecord::Base
  include ImageModel

  image_dir = "jobs"
end
我得到的错误是:

undefined local variable or method `image_dir' for #<Job:0x007f8a93b9e8d8>
我是错过了什么还是忽略了一些重要的事情


Felix

您应该在模块本身中定义您的
图像\u dir=“jobs”
。因为您正在模型中包含模块,而您的模块无法获得声明,所以您已经在模型中完成了

或者您可以更改
delete_image
方法以获取参数:

def delete_image(image_dir)
      unless pic_link == "" || pic_link == nil
        begin
          if File.delete(Rails.root.join("public", "images", image_dir, pic_link))
            return true
          else
            return false
          end
        rescue
          return true #an error occured but when the image does not exist we still return true
        end
      end

      return true
    end
在调用该方法的地方,传递如下参数:

 delete_image("jobs")
替换图像的情况下相同
方法:

 def replace_image(new_image, image_dir)
      File.open(Rails.root.join("public", "images", image_dir, new_image.original_filename), "wb") do |f|
        if f.write new_image.read
          delete_image
          pic_link = new_image.original_filename
          return true #everything went fine
        else
          return false #return false if new image could not be written
        end
      end
    end

希望这会有帮助。谢谢

我认为模块的设计还有改进的余地。但对于这个特定的问题,这里是快速修复

class Job < ActiveRecord::Base
  include ImageModel

  def image_dir
    "jobs"
  end
end
类作业
但我的计划是真正扩展我的模块,这就是为什么我想访问此扩展中的属性。当我转到参数时,我必须把这个逻辑放在我的控制器中,但我想在模型中隔离它。没有办法做到这一点吗?@soupdiver,我的荣幸:)我建议重构的第一步是使模块自给自足。i、 e.除了普通的ActiveRecord实例方法外,该模块中的所有方法最好在其内部调用,也就是说,都有一个默认值。您可以在模型中覆盖它们,但这不应该是模型的责任。
 def replace_image(new_image, image_dir)
      File.open(Rails.root.join("public", "images", image_dir, new_image.original_filename), "wb") do |f|
        if f.write new_image.read
          delete_image
          pic_link = new_image.original_filename
          return true #everything went fine
        else
          return false #return false if new image could not be written
        end
      end
    end
class Job < ActiveRecord::Base
  include ImageModel

  def image_dir
    "jobs"
  end
end