Как вы используете несколько полей формы для взаимодействия с одним методом в рельсах? - PullRequest
1 голос
/ 31 января 2010

У меня есть модель с атрибутами start_at и end_at. В форме для конечного пользователя я отображаю start_at, используя стандарт datetime_select, но я бы предпочел, чтобы второй выбор даты и времени не был представлен пользователю. Я надеюсь, что смогу создать два поля, которые представляют продолжительность; один часами, другой минутами. Мой вопрос заключается в том, как, на мой взгляд, я могу использовать помощники формы для автоматического заполнения полей при редактировании существующей записи. Кроме того, как мне связать это с моделью и впоследствии сохранить запись, используя атрибут real , end_at?

Заранее спасибо за любой совет, который вы можете дать!

Ответы [ 2 ]

1 голос
/ 31 января 2010

Я должен сделать это кучу, и я делал следующее:

  1. Используйте FormTagHelper версии вызовов для поля, которое будет обрабатываться специально.
  2. В контроллере считайте значения form_tag из объекта params.
  3. удалить дополнительные значения:
    
    params[:examplemodelname].delete :distance if params[:examplemodelname].has_key? :distance
  1. поместите 'реальные' значения в объект params (в вашем примере заканчивается_at)
  2. звоните ExampleModelName.new(params[:examplemodelname]) или @examplemodelname.update_attributes(params[:examplemodelname]) как обычно.
0 голосов
/ 07 марта 2011

Не было бы логики, как это было бы лучше подходит для модели? Жирная модель, тощий контроллер?

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

  1. Перетасовка данных между видами и моделями, аля операции CRUD
  2. Контроль доступа (обычно с before_filters)
  3. Поддержка необычных действий пользовательского интерфейса (множественный выбор, мастера и т. Д.)

Конечно, каждый должен найти свой собственный баланс, но я считаю, что «создание исключения» приводит к тому, что исключения повсеместно приводят к исключениям. Не говоря уже о том, что логику контроллера сложнее проверить.

Чтобы ответить на ваш вопрос: вы должны просто определить виртуальные атрибуты в вашей модели, которые помогут вам конвертировать между start_at и длительностью. Что-то вроде:

# Return the duration in seconds. Will look different if you want to use
# multiparameter assignment (which you definitely should consider)
def duration
  (end_at - start_at).seconds
end

# Store the duration as an instance variable. Might need to use multiparameter
# assignment if you use a time_select() in the view.
def duration=(arg)
  @duration = arg
end

before_save :set_end_at
def set_end_at
  end_at = start_at + @duration.seconds
end

Я бы обычно устанавливал фактический атрибут в before_save, чтобы избежать каких-либо условий гонки из назначения формы. У вас нет гарантии, что start_at будет назначен до или после продолжительности, и это может привести к ошибкам в вашей в противном случае хорошей логике.

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