attr_accessor для даты и проблем с использованием select_date - PullRequest
4 голосов
/ 11 февраля 2011

Я пытаюсь использовать attr_accessor для даты, которая обычно работает нормально, за исключением случаев, когда я пытаюсь использовать ее с вспомогательным методом select_date.

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

ActiveRecord :: MultiparameterAssignmentErrors

"search"=>{"number_of_days"=>"3",
 "searchable_id"=>"6933",
 "startdate(1i)"=>"2011",
 "startdate(2i)"=>"2",
 "startdate(3i)"=>"11"}}

Есть ли способ обойти это?Или мне нужно создать какой-то перед фильтром в контроллере?Я бы предпочел сделать это на уровне модели, но я не уверен, как справиться с этим делом?Кажется, что attr_accessor для каждого слишком убит.У кого-нибудь еще есть элегантное решение?

Ответы [ 3 ]

3 голосов
/ 11 февраля 2011

Поля attr_accessor обычно не сохраняются при сохранении / обновлении модели.Как вы обновляете модель?

Кроме того, вы можете преобразовать параметры начальной даты в объект даты следующим образом:

@start_date = Date.civil(params[:search][:"startdate(1i)"].to_i,params[:search][:"startdate(2i)"].to_i,params[:search][:"startdate(3i)"].to_i)

Проверьте здесь

0 голосов
/ 05 июня 2011

Я немного опоздал, но я только столкнулся с этой проблемой и мне не понравился топ-ответ. Я нашел метод в источнике ActiveRecord с именем extract_callstack_for_multiparameter_attributes (это отличается от упомянутого метода idlefingers)

У меня есть следующий метод в моей модели. Я вызываю этот метод вручную, но вы можете переопределить update_attributes для автоматического запуска при сохранении с контроллера. На самом деле аргумент params - это params [: my_model] из контроллера.

attr_accessor :submit_from, :submit_to

def set_dates(params)
  dates = extract_callstack_for_multiparameter_attributes(params)

  dates.each_pair do |field, date_array|
    send "#{field}=", Date.new(*date_array)
  end
end
0 голосов
/ 11 февраля 2011

select_date предназначен для построения выпадающих списков, которые не связаны с модельным полем (с мыслью, что вы можете подобрать их на другой стороне и делать с ними то, что хотите).Я предполагаю, что вы имеете в виду date_select, который работает на модели?

В любом случае, насколько я знаю, если говорить коротко, нет хорошего и красивого способа заставить это работать.Это не из-за того, как работает помощник, а из-за того, как активная запись обрабатывает эти атрибуты, разбитые на несколько параметров.

Если вас интересует немного подробнее, причина, по которой это не такЭто легко сделать, потому что, когда Active Record имеет дело с параметрами, которые вы передали, он проходит через execute_callstack_for_multiparameter_attributes, который интерпретирует ключи, которые были разделены на стиль "date (1i)", иобъединяет их в соответствующий класс, которым они должны быть (объект даты или времени).Чтобы выяснить, должна ли она создать дату или время, нужно проверить ее по типу атрибута ( см. Здесь ), но поскольку ваш атрибут startdate не привязан к определенному типу, он не обрабатывается как столбец даты или даты и времени в БД.

Я думаю, что я справлюсь с этим аналогично @ Phyo-Wai-Win, но используйте select_date для установки другого параметравне пространства имен 'search', которое вы затем передаете в модель соответствующим образом в контроллере.Таким образом, это не так много работы, и это означает, что вы не путаетесь с тем, как вы инициализируете запись или какие атрибуты она ожидает.

...