1

我有一个表单,用户可以在其中上传图片并从列表中选择水印。该字段中的值就是水印的 URL(为了简化开发)。我需要将选择的 watermark_url 传递给模型,以便 rmagick 可以添加水印。我使用回形针进行上传。

在我的模型中,我有以下内容:

class Image < ActiveRecord::Base
...

attr_accessor :watermark_url

has_attached_file :picture, :processors => [:watermark], styles: {
thumb: '100x100>',
medium:{
    geometry: '300x300>',
    watermark_path:  Rails.root.join(watermark_url),
    position: "Center"}
}
end

watermark_url 是表单和数据库中的一个字段(这不是必需的)。然后我得到以下错误:未定义的局部变量或方法`watermark_url'。

我在这里错过了什么吗?

提前感谢您的帮助!

4

3 回答 3

1

您的问题是这watermark_url是一个实例级访问器,但您正试图在类级别访问它。你正在做的是试图打电话Image.watermark_url,但你有什么可用的是Image.first.watermark_url

您不能按照您想要的方式进行操作(在附件定义中),watermark_url因为Image. watermark_path回形针是否自动提供选项之一?

您可能必须执行以下操作:

def watermark_url=(path)
  picture.watermark_path = Rails.root.join(path)
end

或类似的东西。您可能需要对其进行调整以正确告诉回形针此特定 watermark_path 的位置,但希望这可以帮助您入门。

这将使得如果您的表单提交一个watermark_url属性作为 post 参数的一部分,它应该自动发送到这个 setter 方法。

于 2013-08-09T22:45:11.243 回答
0

我不知道你的回形针的版本是什么,但总的来说,我把处理器放在这样的风格中:

has_attached_file :picture, 
                  styles: { 
                      thumb: { '100x100>', :processors => [:watermark] }, 
                      medium:{
                          geometry: '300x300>',
                          :processors => [:watermark],
                          watermark_path:  Rails.root.join(watermark_url),
                          position: "Center"
                      }
                   }
于 2013-08-09T22:34:42.547 回答
0

With your helpful comments I found a solution using lambda to access the instance and its variables. I asked the user for the path of the watermark first, save it and then he uploads his picture.

has_attached_file :picture, :processors => [:watermark], :styles => lambda { |a|
{thumb: '100x100>',
medium:{
    geometry: '300x300>',
    watermark_path:  Rails.root.to_s + "/public#{a.instance.watermark_url}",
    position: "Center"}
}}
于 2013-08-10T16:26:00.607 回答