Ruby / Rails: динамически изменять атрибут в разделяемой части - PullRequest
1 голос
/ 03 декабря 2010

Это должно быть простоя для кого-то ...

Я пытаюсь изменить атрибут поля формы в зависимости от того, какой контроллер / модель вызывает партиал, содержащий поля формы ...

Проблема (ниже) связана с parent_id ..., который ссылается на один из двух столбцов в таблице собак. Оно должно быть либо kennel_id, либо master_id, в зависимости от того, в каком представлении отображается этот фрагмент.

Пока недостаточно комфортно с языком / синтаксисом / инструментами Ruby / Rails, чтобы динамически изменять это, не увязая в if/else инструкциях.

Я вызываю разделяемую частичку и передаю локальную переменную:

= render "dogs/form", :parent => @kennel

или

= render "dogs/form", :parent => @master

В частичном я хотел бы:

  = form_for ([parent, target.dogs.build]) do |f|
    = render "shared/error_messages", :target => parent

    .field
        = f.label :name
        = f.text_field :name
    .field
        = f.hidden_field :parent_id  ###  <= PROBLEM
    .actions
        = f.submit 'Save'

Ответы [ 2 ]

1 голос
/ 03 декабря 2010

Просто подумав вслух:

Я не знаю, есть ли для parent -моделей правильные названия, но вы могли бы сделать что-то вроде:

= f.hidden_field "#{parent.class.name.underscore}_id"

Ноэто не выглядит правильно.Так почему бы не передать его в качестве аргумента?

= render "dogs/form", :parent => @master, :foreign_key => :master_id

Или создать псевдонимы для модели dog для обработки своего рода динамического делегирования:

class Dog
  def parent_id=(parent_id)
    case parent.class
    when Master then self.master_id = parent_id
    when Kennel then self.kennel_id = parent_id
    end
  end
  def parent_id
    case parent.class
    when Master then self.master_id
    when Kennel then self.kennel_id
    end
  end
end

Но это тоже отстой.Может ли отношение быть полиморфным?Тогда вы можете пропустить переключение.

class Dog
  belongs_to :owner, :polymorphic => true
end

= f.hidden_field :owner_id

Просто некоторые идеи.Надеюсь, один из них имеет для вас смысл ...

0 голосов
/ 03 декабря 2010

Ух ты, мой первоначальный ответ даже близко не был.Я думаю, что вам понадобится полиморфная ассоциация: http://guides.rubyonrails.org/association_basics.html#polymorphic-associations Таким образом, родитель может быть тем классом, который вам нужен.

...