Я пытаюсь добавить новое поле к модели в приложении 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
Если это дубликат, возможно, я не нашел его, потому что не знаю, что мне не хватает, если это имеет смысл. Поэтому я буду очень признателен за ссылку на аналогичный вопрос, у которого есть решение.