Заполнение полей формы для одной модели данными из другой модели (в Rails)

#jquery #ruby-on-rails #ajax #ruby-on-rails-3

#jquery #ruby-on-rails #ajax #ruby-on-rails-3

Вопрос:

В принципе, у меня есть модель Events и модель EventSets. События имеют наборы событий (где применимо), поэтому я могу соответствующим образом перечислить и сгруппировать их в приложении (скажем, набор событий Concerts in the Park, где каждое отдельное концертное событие имеет немного отличающиеся атрибуты, но большая часть данных являются общими для всех событий в этом наборе).

У меня есть необходимые ассоциации, чтобы я мог назначить набор событий в Events#new.

В моей модели EventSet у меня есть несколько столбцов информации по умолчанию (общее местоположение, общее имя и т.д.), Которые я хотел бы использовать для предварительного заполнения полей в Events#new.

Набор событий для нового события обозначается полем выбора (в котором перечислены все наборы событий, извлеченные из таблицы EventSets).

Существует ли стандартный способ обработки этого в Rails 3 (с jQuery)? Или я должен использовать свое собственное исправление jQuery / AJAX для обработки этого? (Мне нравится придерживаться разумных значений по умолчанию, где это уместно.)

Редактировать для пояснения: я пытаюсь предварительно заполнить поля формы, все еще находясь в / events / new view, до отправки формы (как только выбран набор событий). Это необходимо, потому что «значения по умолчанию», обозначенные в наборе событий, часто будут переопределены для данного события… они являются лишь отправной точкой для экономии повторения ввода для пользователя.

Ответ №1:

Используйте обратный вызов after_initialize

 def after_initialize :copy_stuff

def copy_stuff
  return unless self.new_record?
  @event_set = EventSet.find(...)
  self.field1 = @event_set.field1
  self.field2 = @event_set.field2
end
  

Вы также могли бы сделать что-то подобное в контроллере.

 def new
   @event_set = EventSet.find(...)
   @event = Event.new(:field1 => @event_set.field1, :field2 => @event_set.field2)
   ...
end
  

Редактировать

Вам нужно будет захватить эти поля с помощью ajax-запроса

routes.rb

 post '/get-eventset-fields' => 'events#event_set_fields', :as => :get_eventset_fields
  

events_controller.rb

 def event_set_fields
  @event_set = EventSet.find_by_id(params[:eventset_id])
  render :json => @event_set.to_json
end
  

new.html.erb

 var mycallback = function(data){
   $('#event_field1').val(data.field1);
   $('#event_field2').val(data.field2);
}

$("#eventset_select").change(function(){
   $.post('<%= get_eventset_fields_path %>', {'eventset_id': $(this).val()}, mycallback, "json"); 
});
  

Комментарии:

1. Спасибо за ответ, но мне следовало более четко указать в моем вопросе: я пытаюсь предварительно заполнить поля формы, все еще находясь в / event / new view, до отправки формы (как только выбран набор событий). Отредактирует вопрос соответствующим образом.