2011-01-17 3 views
1

Как и многие другие, я новичок в Rails и задаю вопрос. Я работаю над образцом трекера для небольшой аналитической лаборатории. Я хотел бы, чтобы пользователи представляли партии, состоящие из множества образцов. Я хочу, чтобы передняя страница была простым входом в пакетную передачу. Мой генеральный план:Динамические вложенные элементы формы на основе ввода начального числа

  1. На первой странице запрашивается количество образцов в партии. Пользователь вводит количество и хиты submit.
  2. Форма генерируется там, где пользователь может вводить пакетную информацию (дата выборки, название эксперимента, материал партии). Под полями партии должно быть столько полей для отдельных идентификаторов образцов, сколько указано пользователем на первом шаге.
  3. Пользователь заполняет все это, и партия и ее образцы создаются при отправке.

Я чувствую, что домашняя страница должна передать какой-то параметр контроллеру партий, который затем итеративно создает образцы, в то время как у модели есть метод для итеративного создания элементов формы для представления. Правильно ли это? Как я могу передать параметр, который не имеет прямого отношения к каким-либо моделям или контроллерам? Я мог бы найти любые подобные вопросы, но если кто-то может связать меня с решением для подобной проблемы или Railscast или что-то, я был бы очень благодарен!

ответ

2

Нет необходимости возвращать форму с моделью. Для вашего зрения, вы просто хотите что-то вроде этого примера (в Haml):

- form_tag new_batch_path, :method => "get" do 
    = label_tag(:sample_count, "Number of samples:") 
    = text_field_tag(:sample_count, 3) 
    = submit_tag("Get Started!") 

, а затем в контроллере, и вид new_batch, вы можете просто ссылаться params[:sample_count]

- (params[:sample_count] || 5).to_i.times do |n| ... 

, потому что это не привязана к модели (и ничто не сохраняется в любом случае), вы не можете использовать проверки модели для проверки значения. Если вы хотите, чтобы убедиться, вы будете делать проверку в контроллере партии - либо в качестве before_filter, или просто инлайн:

@sample_count = params[:sample_count].to_i 
unless (1..10).include? @sample_count 
    flash[:error] = "A batch must contain between 1 and 10 samples." 
    redirect_to root_url 
end 

nil.to_i Обратите внимание, что, "".to_i и мусор, как "ajsdgsd".to_i все равны 0, так что если вы хотите, чтобы люди могли указать 0 образцов, этот код достаточно прочен

+1

Спасибо! Я должен тебе выпить! Одно быстрое наблюдение: поскольку это не привязано к какой-либо модели, я бы подтвердил ее численность, скажем, обратный вызов сверху контроллера, отвечающего за главную страницу ИЛИ контроллера партии, методу, который проверяет, являются ли параметры [ : sample_count] является числовым? –

+0

Удивительный! теперь, чтобы выяснить, как выкупить этот напиток. Кроме того, я обновил пример проверки sample_count. – gunn

0

Посмотрите на эти Railscasts серии:

В скринкасты "Вложенные Модель форма" но я бы пошел с ними первым.

Смежные вопросы