Как сохранить модель с этим динамически генерируемым полем? - PullRequest
0 голосов
/ 21 сентября 2008

У меня есть модель рельсов, которая выглядит примерно так:

class Recipe < ActiveRecord::Base
   has_many :ingredients
   attr_accessor :ingredients_string
   attr_accessible :title, :directions, :ingredients, :ingredients_string

   before_save :set_ingredients

   def ingredients_string
      ingredients.join("\n")
   end

   private

   def set_ingredients
      self.ingredients.each { |x| x.destroy }
      self.ingredients_string ||= false
      if self.ingredients_string
         self.ingredients_string.split("\n").each do |x|
            ingredient = Ingredient.create(:ingredient_string => x)
            self.ingredients << ingredient
         end
      end
   end
end

Идея состоит в том, что когда я создаю ингредиент на веб-странице, я передаю ingredients_string и позволяю модели разобраться во всем. Конечно, если я редактирую ингредиент, мне нужно заново создать эту строку. Ошибка в основном такова: как мне сообщить представление ингридиента (элегантно) и все еще проверить, определен ли ingredient_string в методе set_ingredients?

Ответы [ 3 ]

0 голосов
/ 21 сентября 2008

Предыдущий ответ очень хорош, но он может сделать с несколькими изменениями.

def ингридиенты_строка = (текст) ингридиенты.each {| x | x.destroy} разве что text.blank? text.split ("\ n"). каждый делает | x | ингридиент = Ingredient.find_or_create_by_ingredient_string (: component_string => x) self.ingredients
0 голосов
/ 22 сентября 2008

Я просто изменил ответ Отто:

class Recipe < ActiveRecord::Base
   has_many :ingredients
   attr_accessible :title, :directions, :ingredients, :ingredients_string

   def ingredients_string=(ingredient_string)
      ingredient_string ||= false
      if ingredient_string
         self.ingredients.each { |x| x.destroy }
         unless ingredient_string.blank?
            ingredient_string.split("\n").each do |x|
               ingredient = Ingredient.create(:ingredient_string => x)
               self.ingredients << ingredient
            end
         end
      end
   end

   def ingredients_string
      ingredients.join("\n")
   end

end
0 голосов
/ 21 сентября 2008

Использование этих двух вместе, вероятно, вызывает ваши проблемы. Оба пытаются определить ingredients_string метод, который делает разные вещи

   attr_accessor :ingredients_string

   def ingredients_string
      ingredients.join("\n")
   end

Избавьтесь от attr_accessor, before_save, set_ingredients метода и определите свой собственный ingredients_string= метод, что-то вроде этого:

def ingredients_string=(ingredients)
    ingredients.each { |x| x.destroy }
    ingredients_string ||= false
    if ingredients_string
        ingredients_string.split("\n").each do |x|
            ingredient = Ingredient.create(:ingredient_string => x)
            self.ingredients << ingredient
        end
    end
end

Примечание. Я только что позаимствовал вашу реализацию set_ingredients. Вероятно, есть более элегантный способ разбить эту строку и создать / удалить связи моделей Ingredient по мере необходимости, но уже поздно, и я не могу думать об этом сейчас. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...