Невозможно сохранить / обновить запись в БД в рельсах - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь обновить запись для столбцов IsValid и Comments в rails, но не обновляется в бэкэнде или возникает какая-либо ошибка:

Ниже приведены мои параметры результат:

Started PATCH "/metrics/1" for 
Processing by MetricsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"1oC/1UdAaTPUepy1zIjO1x6n67Th/pdcnvYJH95cB63tZts9d135JIK4MzQD2/pdPoRKnUKXIc0ZI9MQZkjfNQ==", 
  "metrics_controller"=>{"IsValid"=>"False", "Comments"=>"1"}, "commit"=>"Save", "id"=>"1"}
  Metric Load (75.1ms)  SELECT  `Threshold`.* FROM `Threshold` WHERE `Threshold`.`ID` = 1 LIMIT 1
Unpermitted parameters: utf8, _method, authenticity_token, metrics_controller, commit, id
   (75.7ms)  BEGIN
   (75.1ms)  COMMIT

enter image description here

метод обновления в контроллере:

 def update
        @metric = Metric.find(params[:id])
        #if(@metric.update(post_params))
        if(@metric.update_attributes(post_params))
          redirect_to metrics_path
        else
          render 'edit'
        end
      end
       private def post_params
    params.permit(:Metric, :WI, :Value, :UT, :Score, :IsValid, :UserName, :Comments)
  end

Если я обновлю метод post_params приведенным ниже кодом, он выдаст ошибку:

private def post_params
    params.require(:metric).permit(:Metric, :WI, :Value, :UT, :Score, :IsValid, :UserName, :Comments)
  end

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Как упоминал @Tom Lord, регистр ваших параметров выглядит подозрительно и может быть причиной вашей проблемы.Если бы вы могли предоставить свою схему для таблицы metrics, которая поможет нам вам помочь.

Rails всегда будет работать наилучшим образом, если вы будете следовать соглашениям об именах.Это наиболее важно включает использование правильного регистра и имен единственного / множественного числа.

Вот как я мог бы ожидать, чтобы ваш код выглядел, если бы он был написан в Rails-стиле:

def update
  @metric = Metric.find(params[:id])
  if @metric.update(post_params)
    redirect_to metrics_path
  else
    render 'edit'
  end
end

private 

def post_params
  params.permit(:metric, :wi, :value, :ut, :score, :is_valid, :user_name, :comments)
end
0 голосов
/ 14 ноября 2018

Параметры, поступающие из запроса (из журналов):

{
  "utf8"=>"✓",
  "authenticity_token"=>"1oC/1UdAaTPUepy1zIjO1x6n67Th..",
  "metrics_controller"=> {
    "IsValid"=>"False",
    "Comments"=>"1"
  },
  "commit"=>"Save",
  "id"=>"1"
}

Таким образом, ключ isValid находится под ключом metrics_controller.Затем, с этим типом поступающих данных, в вашем контроллере вы должны вызвать

params
  .require(:metrics_controller)
  .permit(:IsValid, :Comments, :id)

. Вы должны позаботиться о соглашении об именах (snake_case вместо CamelCase), но самое главное, что форма, котораяотвечает за этот запрос, должен называть входные данные в соответствии с тем, что ожидает ваш контроллер.

Затем вы должны называть элементы формы чем-то вроде (согласно вашему скриншоту)

<select name="metric[is_valid]">
  <option value="1">Yes</option>
  <option value="0">No</option>
</select>

С такого родаПри именовании данные будут определены в ключе metric вместо metric_controller и будут проходить через сильные параметры.

0 голосов
/ 14 ноября 2018

По соглашению в ruby ​​и rails, вы почти всегда должны использовать snake_case для методов и переменных; не CamelCase.

Вы не предоставили мне достаточно информации, чтобы сказать это со 100% уверенностью (в частности, какова схема базы данных для таблицы metrics?), Но это почти наверняка является причиной проблемы здесь.

Ваш класс Metric, вероятно, имеет такие атрибуты, как value, score, is_valid и т. Д. Но вы пытаетесь обновить атрибуты с именами Comments и IsValid. Эти атрибуты не существуют, поэтому ничего не обновляется.


Измените ваше представление на использование snake_case и разрешите переменные в snake_case; тогда это должно работать. Было бы возможно заставить его работать, используя CamelCase, как вы сделали здесь, но это противоречит соглашениям - поэтому потребует больше усилий.

...