2013-08-09 3 views
0

У меня есть форму, где пользователи могут загружать картинку и выбирать водяной знак из списка. Значение в поле является URL-адресом водяного знака (для упрощения разработки). Мне нужно передать выбранный watermark_url в модель, так что rmagick может добавить водяной знак. Я использую paperclip для загрузки.Rails: Передача переменной из формы в модель

В моей модели у меня есть следующие:

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

Ну, у нас отсутствует код контроллера. :) – BroiSatse

+0

Код модели: def create @image = current_user.images.build (image_params) end Должен ли я передать водяной знак с контроллера на модель? – sebvst

ответ

0

С вашими полезными комментариями я нашел решение, использующее лямбда для доступа к экземпляру и его переменным. Сначала я спросил пользователя о пути водяного знака, сохранил его, а затем он загрузил свою фотографию.

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"} 
}} 
0

Я не знаю, что это версия вашей скрепки, но в целом, я поставил процессор в стиле, как это:

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

Все работает нормально, если я вручную установил watermark_url. watermark_url = "/system/images/pictures/000/000/027/medium/watermark3.jpg". Проблема в том, что я хочу передать URL-адрес из формы. – sebvst

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_url как часть параметров post, он автоматически должен быть отправлен этому методу setter.

+0

Спасибо за ответ. Это настраиваемый процессор, который использует параметр watermark_path. Тонкая настройка пути в конце не должна быть проблемой, как только я смогу передать URL водяного знака модели. – sebvst

+0

Мне удалось передать URL-адрес новому методу «watermar_url» в моей модели и установить параметр picture.watermark_path на правильный URL. Так что у меня это в модели, но я не могу назвать ее вне этого метода. Что я делаю не так? Это метод: def add_url (url); \t self.watermark_url = url.to_s; конец'. Как я могу вызвать self.watermark_url вне этого метода? – sebvst

+0

Зачем вам нужен метод 'add_url'? В любом случае, если 'watermark_url =' - это метод, вам нужно будет также определить метод getter 'watermark_url', если вы хотите получить метод для получения установленного значения. Вы можете хранить «путь» в переменной экземпляра и извлекать его из «watermark_url», если хотите (так работает «attr_accessor» под капотом). – nzifnab