我有一个表单,用户可以上传图片并从列表中选择水印。然后,该字段中的值是水印的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'。
我在这里错过了什么吗?
提前感谢您的帮助!
答案 0 :(得分:1)
您的问题是watermark_url
是实例级访问者,但您正尝试在类级别访问它。您正在尝试拨打Image.watermark_url
,但您可以使用Image.first.watermark_url
。
您不能按照您想要的方式(在附件定义中)执行此操作,因为watermark_url
对于Image
的每个实例都不同。 {1}是纸夹自动提供的选项之一吗?
您可能需要执行以下操作:
watermark_path
或类似的东西。您可能需要调整它以正确告诉paperclip这个特定的watermark_path的位置,但希望这可以让您开始。
这将使得如果您的表单提交def watermark_url=(path)
picture.watermark_path = Rails.root.join(path)
end
属性作为post params的一部分,它将自动发送到此setter方法。
答案 1 :(得分:0)
我不知道您的回形针的版本是什么,但总的来说,我把处理器放在风格中,如下所示:
has_attached_file :picture,
styles: {
thumb: { '100x100>', :processors => [:watermark] },
medium:{
geometry: '300x300>',
:processors => [:watermark],
watermark_path: Rails.root.join(watermark_url),
position: "Center"
}
}
答案 2 :(得分:0)
通过您的有用评论,我找到了一个使用lambda访问实例及其变量的解决方案。我首先向用户询问了水印的路径,然后将其保存,然后上传了他的照片。
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"}
}}