Что может заставить Rails 5 не устанавливать параметр в build (), даже если он был заполнен? - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь добавить новое поле к модели в приложении Rails. Поле представляет собой простое отношение own_to, которое устанавливается в модели, подобно другим отношениям в той же модели.

Я добавил поле в метод modelname_params, а метод create контроллера делает вызов .build() с этими параметрами в качестве аргумента, все довольно стандартно.

Поле отображается в форме, извлекает правильные значения (это раскрывающийся список), и если я помещаю отладчик byebug непосредственно перед строкой, в которой сохраняется код, я вижу, что значение находится в объекте params [] на том же уровне, что и все другие поля.

И все же, когда сохранение действительно выполняется, Для нового поля установлено значение nil, вместо того, чтобы сохранять данные, хранящиеся в params, как я ожидал, без выдачи ошибки или возникновения каких-либо других проблем. Mechani c Я просто не в курсе, но я хоть убей не могу понять, как сохранить это поле. На мой взгляд, я почти точно отражаю то, что делают другие поля, с той лишь разницей, что поле выбора отображается в форме. Я тоже подумал о выравнивании этого параметра, но у меня возникла небольшая проблема с использованием того же подхода Javascript, который используют другие поля. В идеале мне бы хотелось, чтобы он работал так, как я настроил.

# create method 
def create
    @problem_report = current_project.problem_reports.build(problem_report_params)
*snip*
end
# strong params declaration
  def problem_report_params
    params.require(:problem_report).permit(
      :asset_code,
      :asset_id,
      :description,
      :reporter_name,
      :reporter_email,
      :priority,
      :building_id,
      :floor_id,
      :room_id,
      photos_attributes: [:id, :file, :_destroy]
    )
  end


# form

<div class="card card-default">
  <div class="card-body">
    <%= f.form_group :building_id, label: { text: "Building" } do %>
      <select id="buildings" name="problem_report[building_id]" class="select2-input" style="width: 100%" data-placeholder="Select a building..."></select>
    <% end %> <!-- works -->
      <%= f.collection_select :asset_id, f.object.project.assets, :id, :name, { include_blank: true }, control_class: "select2-input", style: "width: 100%", data: { placeholder: "Select asset linked to this problem report..." } %> <!-- works as in the param gets in the right place, but isn't saved
    
    <%= f.form_group :floor_id, label: { text: "Floor" } do %>
      <select id="floors" name="problem_report[floor_id]" class="select2-input" style="width: 100%" data-placeholder="Select a floor..."></select>
    <% end %>

    <%= f.form_group :room_id, label: { text: "Room" } do %>
      <select id="rooms" name="problem_report[room_id]" class="select2-input" style="width: 100%" data-placeholder="Select a room..."></select>
    <% end %>

*snip* <!-- below, a bit of Javascript retrieves a resource as_json that has the details for floor, room and building, but not assets. That's why the approach is different for those -->

# Except, when I run this, the asset is not saved. I see it in params when I debug it, yet it is not saved, and I have no idea why not

# model
class ProblemReport < ApplicationRecord
*snip*
  belongs_to :project
  belongs_to :building, optional: true
  belongs_to :floor, optional: true
  belongs_to :room, optional: true
  belongs_to :asset, optional: true
*snip*
end

# currently, the inverse relationship doesn't exist sinceI'm only going the one way. Is that necessary?


Вывод журнала, включая byebug, довольно длинный, я сохранил здесь в Pastebin: https://pastebin.com/hbgDs9eH

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

...