У меня есть приложение Rails, которое отображает Content
. Каждая часть Контента принадлежит Source
, а Источник имеет_много Контента. Каждый источник состоит из name
и domain
.
Контент также принадлежит Edition
. Мое приложение настроено так: в форме для создания/редактирования Editions
я вложил поля формы для Contents
, используя гем Cocoon.
Вложенные поля для содержимого включают поле link
. Что мне нужно сделать, так это сравнить link
с различными domains
в таблице "Источники" и установить соответствующие source_id
для вновь созданного/отредактированного контента.
Я думал, что могу установить соответствующие source_id
в editions controller
на действия update
или create
. Однако, поскольку единственными данными, которые я получаю, является хэш параметров со встроенным хэшем contents_attributes
(который не содержит ссылки на source_id
, поскольку source
не задан в форме), как я могу установить source_id
, используя «ссылку», представленную на форма?
Вот мои действия по созданию и обновлению в editions_controller:
def create
@edition = Edition.new(edition_params)
respond_to do |format|
if @edition.save
format.html { redirect_to @edition, notice: 'Edition was successfully created.' }
format.json { render :show, status: :created, location: @edition }
else
format.html { render :new }
format.json { render json: @edition.errors, status: :unprocessable_entity }
end
end
end
def update
respond_to do |format|
if @edition.update(edition_params)
format.html { redirect_to @edition, notice: 'Edition was successfully updated.' }
format.json { render :show, status: :ok, location: @edition }
else
format.html { render :edit }
format.json { render json: @edition.errors, status: :unprocessable_entity }
end
end
end
И вот используемые параметры:
def edition_params
params.require(:edition).permit(:date,
:clicks,
:product_id,
contents_attributes: [:id,
:heading,
:body,
:link,
:top_story,
:section_id,
:_destroy
]
)
end
Должен ли я иметь скрытый ввод в форме с source_id? Или это можно сделать как есть на контроллере?
||=
только на=
, как вы сказали, так как я хотел, чтобы это работало всякий раз, когда ссылка редактировалась. Однако я не понял одного: почему вы использовали&&
в последней строке:self.source ||= link && Source.fetch_from_link(link)
? На этой ноте, почему бы просто не сказатьself.source = Source.fetch_from_link(link)
02.08.2018Source.fetch_from_link(link) if link
, только красивее. Вы не хотите столкнуться с ошибкой, когда ссылкаnil
. 02.08.2018link && Source.fetch_from_link(link)
проверяет, что оба элемента существуют, но возвращает только последний элемент, то естьSource.fetch_from_link(link)
? 02.08.2018