Rails:将变量从表单传递给模型

时间:2013-08-09 22:23:09

标签: ruby-on-rails paperclip rmagick

我有一个表单,用户可以上传图片并从列表中选择水印。然后,该字段中的值是水印的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'。

我在这里错过了什么吗?

提前感谢您的帮助!

3 个答案:

答案 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"}
}}
相关问题