Рельсы: измените параметры в соответствии с требуемой структурой

#ruby-on-rails #ruby-on-rails-5

Вопрос:

У меня есть несколько параметров, которые мне нужно изменить?

У меня есть старая база данных, поверх которой я пытаюсь создать новое приложение для доступа и выполнения сложных операций.

Мне просто нужно создать эту структуру…

 {
"volunteer_shift_attributes"=><ActionController::Parameters{
    "volunteer_task_type_id"=>"41", 
    "roster_id"=>"7",
    "program_id"=>"9",
    "set_description"=>"ddddddddddd"
} permitted: true>, 
"set_date"=>"2021-01-14", 
"contact_id"=>"166574", 
"closed"=>"0", 
"start_time(4i)"=>"14", 
"start_time(5i)"=>"00", 
"end_time(4i)"=>"15", 
"end_time(5i)"=>"00",
"notes"=>"nnnnnnnnnnnnn",
}
 

имейте такую структуру…

 {
"volunteer_shift_attributes"=>{
    "volunteer_task_type_id"=>"41", 
    "roster_id"=>"7", 
    "program_id"=>"9", 
    "set_description"=>"ddddddddddd"
}, 
"set_date"=>"2021-01-15",  
"contact_id"=>"166574", 
"closed"=>"0", 
"start_time(4i)"=>"14", 
"start_time(5i)"=>"00", 
"end_time(4i)"=>"15", 
"end_time(5i)"=>"00", 
"notes"=>"aaaaaaaaaaaaaa"
}
 

ПРИМЕЧАНИЕ: это вызывается внутри метода контроллера следующим образом

 def create_shift
...
   a.attributes = (params["assignment"])
...
end
 

Мне нужно восстановить этот параметр вручную.

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

1. Вы можете позвонить .to_h , чтобы преобразовать параметры ActionController::в простой хэш. Хотя ActiveRecord должен отлично обрабатывать объект параметров.

2. @arieljuod итак, вы говорите, что params[«назначение»].to_h исправит это?

3. @Eyeslandic добавил ОБНОВЛЕНИЕ к сообщению. надеюсь, эта дополнительная информация ответит на вопрос.

4. Спасибо за обновление. Это похоже на пользовательское сообщение об ошибке, так что, по-видимому, в модели добровольцев или где-то еще есть что-то, что ее определяет. Если вы можете определить, где определена ошибка, вы можете увидеть, какое условие ее вызывает. (Кроме того, нигде в ваших парах нет ключевого «назначения», поэтому неудивительно, что это не удается.)

5. Похоже, вы отменили обновление и снова удалили информацию из вопроса. Можете ли вы сообщить нам, почему вы это сделали?

Ответ №1:

Не совсем понятно, зачем вам это нужно — это просто параметры, и вы не хотите менять структуру, точно. Но, похоже, это может быть поводом для сильных парамов. Определите частный метод:

 def volunteer_shift_params
  params.require(:volunteer_shift_attributes)
        .permit(:volunteer_task_type_id, 
                :roster_id, 
                :program_id, 
                :set_description)
end
 

Тогда вы должны быть в состоянии сделать это, как вы просили:

 a.attributes = volunteer_shift_params
 

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

1. Сильные параметры были отключены. Мне просто нужно изменить строку параметров из одной структуры в другую, как указано.

2. Объяснение отключения сильных параметров в вашей правке вопроса для меня не имеет смысла. Строгие параметры касаются только того, как форма взаимодействует с вашим приложением Rails 5, а не с базой данных. И это отличный способ сделать ваше приложение более безопасным.