2015-02-09 4 views
0

У меня есть следующие виртуальные атрибуты в моей модели:использования несколько виртуальных входов формы атрибута для обновления одной модели атрибута

attr_accessor :city, :zip, :street, :suite 

В новой форме/редактирования, я поле формы для каждого из этих атрибутов. Я могу преобразовать эти четыре атрибута в один адрес_ид с ​​помощью метода, который мы будем называть address_lookup. Мне нужно только сохранить адрес_ид в модели. Каков базовый подход к чистому управлению этим в действиях контроллера create/update и (при необходимости) модели? Это немного над моей головой.

+0

Параметр 'attr_accessor' ** ** устанавливает методы getter и setter. – smathy

ответ

1

Простейшим является добавление в before_save обратного вызова, мы будем использовать the changed array, чтобы проверить, является ли какой-либо из атрибутов мы заинтересованы в изменились, прежде чем мы делаем наш поиск:

before_save :set_address 

def set_address 
    if address = Address.find_or_create_by(city: city, zip: zip, street: street, suite: suite) 
    self.address = address 
    end 
end 
+0

awesome, проверяя это сейчас –

+0

Как пользователь вводит значения города/zip/street/suite? Я попробовал Address.find_or_create_by (город: self.city, zip: self.zip ..), но self.city, self.zip и т. Д. Каждый возвращает blank/null. То же самое происходит, когда я набираю его точно так, как показано в вашем примере, без себя. Я должен отметить, что я не использую ваше измененное сравнение, потому что для этого этапа разработки мне нужно обновлять запись каждый раз, независимо от того, была ли она изменена. –

+0

Ну, я полагаю, что в вашем контроллере вы устанавливаете атрибуты модели для входящих значений формы, например. '@markup = Параметры Markup.find [: id]; if @ markup.update (markup_params); # и т. д. с чем-то вроде: 'def markup_params; params.require (: markup) .permit (: other,: things,: and,: city,: zip,: street,: suite); end' – smathy